Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемка с классами и инклюдами 
V
    Опции темы
Жывотное
  Дата 8.10.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 6.7.2009

Репутация: нет
Всего: 1



Камрады, нужна помощь.
После нескольких лет программирования на 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, может быть его как-то можно использовать?


PM MAIL   Вверх
mes
Дата 8.10.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



поиск по forward declaration
в двух словах : в MyWin добавить строчку  class CMyApp;


--------------------
PM MAIL WWW   Вверх
Жывотное
Дата 8.10.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 6.7.2009

Репутация: нет
Всего: 1



Цитата(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 
PM MAIL   Вверх
zim22
Дата 8.10.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



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

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


--------------------
PM MAIL   Вверх
Anikmar
Дата 8.10.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



В *.h forward-декларация, а в *.cpp сам #include
PM MAIL ICQ   Вверх
Жывотное
Дата 8.10.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 6.7.2009

Репутация: нет
Всего: 1



Итак, имеем:

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, то всё компилируется и линкуется. Но приложение не запускается, судя по всему этот глобальный объект используется фреймворком для запуска.
PM MAIL   Вверх
zim22
Дата 8.10.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



удали из файла MyApp.h эту строку
Код

CMyApp theApp;


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

#include "MyApp.h"
CMyApp theApp;



--------------------
PM MAIL   Вверх
Жывотное
Дата 8.10.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 6.7.2009

Репутация: нет
Всего: 1



zim22, спасибо! Это помогло.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.