Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Extern Class Declaration

Tags:

c++

I wrote a little test program to show here. Here is the source code.

main.cpp:

#include "core.h"

Core core;

int main()
{
  core.coreFunction();
}

core.h:

#ifndef CORE_H__
#define CORE_H__

#include "definitions.h"
#include "window.h"

class Core
{
public:
  Window window;
  void coreFunction()
  {
    window.windowFunction();
  }
};
extern Core core;

#endif

definitions.h

#ifndef DEFINITIONS_H__
#define DEFINITIONS_H__

class Core;
class Window;

#endif

window.h

#ifndef WINDOW_H__
#define WINDOW_H__

class Window
{
public:

   void windowFunction()
   {
     core.coreFunction();
   }
};

#endif

With this test program I get the following error: window.h(10): error C2065: 'core' : undeclared identifier. I hope this clarifies my problem a little bit. Please ignore that these functions make no sense its just for showing what I did because my original code is way too long to post here.

like image 948
roohan Avatar asked Oct 27 '11 22:10

roohan


1 Answers

You are including the window.h header before the "extern Core core;" line. Try adding that line just before the class Window line on the window.h header:

window.h

#ifndef WINDOW_H__
#define WINDOW_H__

extern Core core;

class Window
{...}

Instead of using Core as a global variable, you can move core as a static member of the Core class. This is called the Singleton pattern.

main.cpp

#include "core.h"

int main()
{
  Core* core = Core::getInstance();

  core->coreFunction();
}

core.h

#include "window.h"

class Core
{
public:
  static Core* getInstance() { return &coreInstance; }
  void someFunction();

private:
  static Core coreInstance;
  Window window;
};

core.cpp

#include "core.h"

Core Core::coreInstance;

void Core::someFunction()
{
  window.doSomething();
}

window.h

class Window
{
  void someFunction();
};

window.cpp

#include "window.h"
#include "core.h"

void Window::someFunction()
{
  Core* core = Core::getInstance();

  core->doSomething();
}
like image 171
vz0 Avatar answered Sep 20 '22 17:09

vz0