Reputation: 751
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.
Upvotes: 7
Views: 83202
Reputation: 32923
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();
}
Upvotes: 9
Reputation: 66922
Either you forgot to define core's default constructor, or core cannot be trivially default constructed (due to having a base or member that does not have a default constructor.
To core, add:
class Core {
Window window;
Core() {} //add this line
void someFunction()
{
window.doSomething();
}
}
To window, add:
class Window
{
Window() {} //add this line
void someFunction()
{
core.doSomething();
}
}
If either fails to compile, you'll have pinned down the problem a little more
Well now that the error message was clarified, I see the error right off. Window.h
requires Core core
to be defined, and Core.h
requires Window
to be defined. The solution is to do as vz0 suggested from the get go. Move the definition of Window::someFunction
to window.cpp
(and I feel the need to go apologize to vz0)
Upvotes: 0
Reputation: 3832
I think I found your problem. In the definition header file the "Core" class is declared as "core". Remember, caps makes a big difference.
Upvotes: 0