Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кросс включение заголовочных файлов / 13 сообщений из 13, страница 1 из 1
08.12.2006, 12:32
    #34185823
Funt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
Есть два заголовочных файла с описанием классов. Каждый класс содержит экземпляр другого:

Файл "ProxyContext.h"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#pragma once
#include "ServiceContext.h"
#include "ProxySocketMgr.h"

class CProxyContext : public CServiceContext  
{
public:
	CProxyContext() {};
	virtual ~CProxyContext() {};
	CProxySocketMgr *m_pCurServer;
	void TraceRequest(LPСTSTR chRequest);
};

Файл "ProxySocketMgr.h"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#pragma once
#include "SocketComm.h"

class CProxyContext;

class CProxySocketMgr : public CSocketComm  
{
public:
	CProxySocketMgr();
	virtual ~CProxySocketMgr();

	void AppendMessage(LPCTSTR strText) {
		if (NULL != m_pContext)
			m_pContext->TraceRequest(strText);
	};

protected:
	CProxyContext *m_pContext;
};

Ошибка возникает при вызове метода TraceRequest класса CProxyContext, хотя без него (только с описанием переменной m_pContext) все компилируется.
Не подскажите, как разрешить данную проблему.

Компилируется в Visual Studio 2005, если что
...
Рейтинг: 0 / 0
08.12.2006, 12:46
    #34185875
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
Что за ошибка?
...
Рейтинг: 0 / 0
08.12.2006, 12:54
    #34185916
Funt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
Error 23 error C2027: use of undefined type 'CProxyContext' c:\mydocs\visual studio 2005\projects\icontri\i3service\proxysocketmgr.cpp 17
Error 24 error C2227: left of '->TraceRequest' must point to class/struct/union/generic type c:\mydocs\visual studio 2005\projects\icontri\i3service\proxysocketmgr.cpp 17
...
Рейтинг: 0 / 0
08.12.2006, 13:02
    #34185957
Funt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
Проблема решается добавлением
Код: plaintext
#include "ProxyContext.h"
в "ProxySocketMgr.cpp"

Единственное, хочется понять, верно это или нет. Я считал, что достаточно одного включения (в "ProxyContext.cpp"). Возможно, я не прав.
...
Рейтинг: 0 / 0
08.12.2006, 13:24
    #34186071
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
FuntПроблема решается добавлением
Код: plaintext
#include "ProxyContext.h"
в "ProxySocketMgr.cpp"

Единственное, хочется понять, верно это или нет. Я считал, что достаточно одного включения (в "ProxyContext.cpp"). Возможно, я не прав.

Каждый cpp отрабатывается отдельно, поэтому если в нем нет включения он ничего не будет знать об описании класса.
...
Рейтинг: 0 / 0
08.12.2006, 13:32
    #34186102
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
FuntПроблема решается добавлением
Код: plaintext
#include "ProxyContext.h"
в "ProxySocketMgr.cpp"

Единственное, хочется понять, верно это или нет. Я считал, что достаточно одного включения (в "ProxyContext.cpp"). Возможно, я не прав.

Ашники служат для объявления.
При этом на проходе компилятора, по исходникам смотрится та инфа которая необходима... Если Вы объявляете указатель на класс (а имя класса просто объявлено выше) внутри ашника (к примеру) - то компилятор знает его размерность - это ему ДОСТАТОЧНО. А вот когда Вы зовёте метод этого класса - этой инфы (что он просто некий класс) - уже не достаточно. Для этого нужно описание этого класса, из которого вычисляются относительные смещение в бинарном коде.

То что Вы разместили полное описание класса в другом сипипишнеке (который лезет к его методу) - это нормально.

И ещё. Очень редки те ситуации, когда компилятор компилирует - но ошибка возникает из за не правильной трактовки кода (к исключениям мона отнести НЕ типизированное использование указателей и иже). Можно сказать, что задача программиста складывается из этапов: компиляции (самая первая лёгкая победа), успешного запуска (уже получше), правильной физической работы (ну считай одна треть дела), правильной логической работы (уже половину прошли), и работы без глюков (ну это как коммунизм - на горизонте и к этому стремимся)...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
08.12.2006, 15:39
    #34186655
Funt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
Всем спасибо за просвещение начинающего.
...
Рейтинг: 0 / 0
08.12.2006, 15:49
    #34186697
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
достаточно вынести тело AppendMessage в спп-файл и будет счастье.
...
Рейтинг: 0 / 0
08.12.2006, 16:04
    #34186758
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
maXmoдостаточно вынести тело AppendMessage в спп-файл и будет счастье.

Так он это и так сделал
...
Рейтинг: 0 / 0
08.12.2006, 17:01
    #34186942
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
нет, не сделал, тело функции в ашнике сидит, а должно сидеть в сппшнике.
...
Рейтинг: 0 / 0
08.12.2006, 17:05
    #34186950
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
maXmoнет, не сделал, тело функции в ашнике сидит, а должно сидеть в сппшнике.

Разве студия не должна говорить, что ошибка в ашнике, который инклудится из сипипишника?
...
Рейтинг: 0 / 0
08.12.2006, 17:10
    #34186966
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
хмм... может быть...
значит забыл в сппшнике ProxyContext.h подрубить
...
Рейтинг: 0 / 0
11.12.2006, 13:04
    #34189949
Fenriz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кросс включение заголовочных файлов
если расставить все точки над i,
то вот это забвная фишка include при компиляции просто вставляет файл что указан в данный код.
описание должно быть подключено выше самой имплементации, для предотвращения нежелательных пересечений лутше использовать class xxxx extern "C++";
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кросс включение заголовочных файлов / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]