как получить доступ к объекту класса A, определенного в main, из другого класса

0

У меня есть два класса с их соответствующим пространством имен.
Класс 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().

Теги:
namespaces

1 ответ

2
Лучший ответ

Вероятно (но не обязательно, без кода просмотра) эта проблема возникла из-за того, что 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;
  };
}
  • 0
    Да .. вот проблема .. как @MM и @Mohammad, описанные выше. это круговая проблема зависимости. что мне нужно, так это больше практиковаться в проектировании на с ++. Я кодировал в Си всю свою жизнь. это займет некоторое время, чтобы привыкнуть. Спасибо за помощь.
  • 1
    @ 2am Один небольшой факт о шаблонах проектирования C ++ - наличие каждого класса в отдельном пространстве имен не является обычной или хорошей практикой. Пространства имен используются для группировки связанных классов (например, функции предназначены для группировки связанного кода или классы для группировки связанных функций), и обычно одно пространство имен содержит намного больше одного класса (например, пространство имен std )
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню