У меня есть два класса с их соответствующим пространством имен.
Класс A имеет объект класса B и может вызывать методы из класса B.
Я хочу, чтобы класс B также вызывал метод из класса A, для этого я включаю "classA.h" в classB.h, но когда я это делаю, я получаю сообщение об ошибке.
error C2653: 'classB_namespace' : is not a class or namespace name
Я использую win32 sdk для этого проекта, и я определил WinMain() в classA.cpp, в WinMain() У меня есть объект класса A, который вызывает wndProct, определенный в classB.
Я хочу получить доступ к этому объекту classA из класса B (чтобы вызвать этот метод в classA, поэтому я все это делаю..).
Как, и что более важно, это можно сделать? Я использовал extern для объекта classA в WinMain(), не работал.
Итак, нижняя линия, я не могу вызывать этот метод из класса B, который определен в классе A, используя объект, определенный в WinMain().
Вероятно (но не обязательно, без кода просмотра) эта проблема возникла из-за того, что C++ скомпилирован за один проход. Таким образом, #include
не похож на директиву использования на других языках (например, на С# или java) - вы должны отслеживать все определения в правильном порядке - каждый класс должен быть объявлен (или даже полностью определен) до его использования, независимо от того, находится ли код в одном файле или несколько включенных заголовков. И пространства имен ничего не меняют - порядок определений должен быть сохранен.
Это неправильный код, потому что класс B упоминается до его объявления:
class A {
B objB;
};
class B {
A *parent;
};
Правильный порядок объявления:
class A;
class B {
A *parent;
};
class A {
B objB;
};
Или, с каждым классом в отдельном пространстве имен, это будет так:
namespace classA_namespace {
class A;
}
namespace classB_namespace {
class B {
classA_namespace::A *parent;
};
}
namespace classA_namespace {
class A {
classB_namespace::B objB;
};
}
std
)