Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Проблемка с классами и инклюдами


Автор: Жывотное 8.10.2009, 11:40
Камрады, нужна помощь.
После нескольких лет программирования на Java возникла необходимость вспомнить C++. И тут же вылезла проблема, с которой не смог сам справиться.
Есть у меня два класса. В одном из них имеется член - объект второго класса. И нужно из этого объекта второго класса обратиться к методу первого класса. То есть, как я понимаю, в этом объекте должна быть ссылка на объект первого класса, которому он принадлежит.
Проиллюстрирую на примере.

MzMailer.h. Первый класс - главный, с него начинается выполнение программы:
Код

#include "MyWnd.h"

class CMyApp : public CMzApp
{
protected:
  СMyWnd m_wndMain;

public:
  virtual BOOL Init();
  void SomeMethod();
};

CMyApp theApp;


MyWnd.h. Из этого класса нужно вызвать некий метод CMyApp::SomeMethod().
Код

class CMyWnd: public CMzWndEx
{
  MZ_DECLARE_DYNAMIC(CMyWnd);
protected:
  CMyApp* app;

  UiCaption m_Caption;
  UiToolbar_Text m_Toolbar;
  virtual BOOL OnInitDialog(void);
  virtual void OnMzCommand(WPARAM wParam, LPARAM lParam);

public:
  CMyWnd(CMyApp* app);
};


Сейчас класс CMyWnd ничего не знает о классе CMyApp, поэтому компилятор вполне резонно ругается.
Но и простой #include "MyApp.h" в MyWnd.h не помогает.
Соответственно вопрос - как быть в этой ситуации?
И еще, в MyApp.h есть глобальный объект theApp, может быть его как-то можно использовать?


Автор: mes 8.10.2009, 11:46
поиск по forward declaration
в двух словах : в MyWin добавить строчку  class CMyApp;

Автор: Жывотное 8.10.2009, 12:04
Цитата(mes @ 8.10.2009,  11:46)
поиск по forward declaration
в двух словах : в MyWin добавить строчку  class CMyApp;

Про forward declaration я знаю, пробовал.
На описание класса CMyWnd перестает ругаться, но начинает ругаться на описание CMyApp:
Цитата

Error    1    error C2079: 'CMyApp::m_wndMain' uses undefined class 'CMyWnd'

 smile 

Автор: zim22 8.10.2009, 12:13
Цитата(Жывотное @  8.10.2009,  12:04 Найти цитируемый пост)
Error    1    error C2079: 'CMyApp::m_wndMain' uses undefined class 'CMyWnd'

тут же всё написано. компилятор не имеет доступа к определеню класса  СMyWnd в точке определения переменной m_wndMain 

Автор: Anikmar 8.10.2009, 12:14
В *.h forward-декларация, а в *.cpp сам #include

Автор: Жывотное 8.10.2009, 13:30
Итак, имеем:

MyApp.h
Код

#include "MyWnd.h"

class CMyApp : public CMzApp
{
protected:
  СMyWnd m_wndMain;
public:
  virtual BOOL Init();
  void SomeMethod();
};
CMyApp theApp;


MyWnd.h
Код

class CMyApp;

class CMyWnd: public CMzWndEx
{
  MZ_DECLARE_DYNAMIC(CMyWnd);
protected:
  CMyApp* app;
  UiCaption m_Caption;
  UiToolbar_Text m_Toolbar;
  virtual BOOL OnInitDialog(void);
  virtual void OnMzCommand(WPARAM wParam, LPARAM lParam);
public:
  CMyWnd(CMyApp* app);
};


CMyWnd.cpp
Код

#include "MyApp.h"
#include "MyWnd.h"

BOOL CMainWnd::OnInitDialog() {...}

void CMainWnd::OnMzCommand(WPARAM wParam, LPARAM lParam) {...}


Теперь ругается линкер:
Цитата

Error    1    error LNK2005: "class CMyApp theApp" (?theApp@@3VCMyApp@@A) already defined in MyWnd.obj
Error    2    fatal error LNK1169: one or more multiply defined symbols found    M8SDK    MyApp


Если убрать из MyApp.h глобальный объект theApp, то всё компилируется и линкуется. Но приложение не запускается, судя по всему этот глобальный объект используется фреймворком для запуска.

Автор: zim22 8.10.2009, 13:38
удали из файла MyApp.h эту строку
Код

CMyApp theApp;


создай файл MyAPP.cpp c таким содержимым:
Код

#include "MyApp.h"
CMyApp theApp;

Автор: Жывотное 8.10.2009, 14:22
zim22, спасибо! Это помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)