1>------ Build started: Project: simple, Configuration: Debug Win32 ------
1>Compiling...
1>simple.cpp
1>d:\sources\itrium\simple\simple\cls2.h(15) : error C2027: use of undefined type 'cls1'
1> d:\sources\itrium\simple\simple\cls2.h(5) : see declaration of 'cls1'
1>d:\sources\itrium\simple\simple\cls2.h(15) : error C2227: left of '->test1' must point to class/struct/union/generic type
1>cls1.cpp
1>d:\sources\itrium\simple\simple\cls2.h(15) : error C2027: use of undefined type 'cls1'
1> d:\sources\itrium\simple\simple\cls2.h(5) : see declaration of 'cls1'
1>d:\sources\itrium\simple\simple\cls2.h(15) : error C2227: left of '->test1' must point to class/struct/union/generic type
1>Generating Code...
1>Build log was saved at "file://d:\Sources\Itrium\simple\simple\Debug\BuildLog.htm"
1>simple — 4 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
такое ощущение, что компилятор не знает, что у cls1 есть переменная test1.
подскажите, как побороть проблему?
B>такое ощущение, что компилятор не знает, что у cls1 есть переменная test1. B>подскажите, как побороть проблему?
А ты поработай препроцессором
Смотри:
// main.cpp
//#include "cls1.h"
#pragma once
//#include "cls2.h"
#pragma once
//#include "cls1.h" - проигнорировано, второе включение
class cls1; // а до объявления еще не добрались :)
class cls2
{
public:
cls2() { pCls1 = NULL; }
int test2;
cls1 *pCls1;
void setp(cls1 *p);
// правильно, здесь проблема
void prnt() { if (pCls1) printf("%d\n", pCls1->test1); } // <-- проблема здесь
};
// и только здесь начинается объявление cls1
...
B>#pragma once
B>#include"cls1.h"
B>class cls1;
B>class cls2
B>{
B>public:
B> cls2() { pCls1 = NULL; }
B> int test2;
B> cls1 *pCls1;
B> void setp(cls1 *p);
B> void prnt() { if (pCls1) printf("%d\n", pCls1->test1); }// <-- проблема здесь
B>};
B>
B>
1>>------ Build started: Project: simple, Configuration: Debug Win32 ------
1>>Compiling...
1>>simple.cpp
1>>d:\sources\itrium\simple\simple\cls2.h(15) : error C2027: use of undefined type 'cls1'
1>> d:\sources\itrium\simple\simple\cls2.h(5) : see declaration of 'cls1'
1>>d:\sources\itrium\simple\simple\cls2.h(15) : error C2227: left of '->test1' must point to class/struct/union/generic type
B>такое ощущение, что компилятор не знает, что у cls1 есть переменная test1. B>подскажите, как побороть проблему?
Проблема в том, что на момент использования переменной pCls1 её тип не определён, есть только forward declaration.
В заголовочных файлах оставляем только forward declaration, include соответствующего .h переносим в .cpp (в .h он не нужен при fd), реализацию методов переносим в .cpp
Проблема уходит (указаная).
Re[2]: Два класса, имеющих указатели друг на друга
Здравствуйте, Nik_1, Вы писали:
N_>кстати, а как узнать что получается из файла после работы препроцессора?
Есть в настройках файла (в VC). Если включить, рядом с cpp-шником начнет генерится i-файл, показывающий результат препроцессинга. Но перестанет генерится obj-шник
К рекомендации выности все зависимые вещи в .срр — файлы стоит прислушаться, но в данном случае проблема решается, если убрать #include "cls2.h" из cls1.h.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Два класса, имеющих указатели друг на друга
Здравствуйте, Went, Вы писали:
W>Здравствуйте, Nik_1, Вы писали:
N_>>кстати, а как узнать что получается из файла после работы препроцессора?
W>Есть в настройках файла (в VC). Если включить, рядом с cpp-шником начнет генерится i-файл, показывающий результат препроцессинга. Но перестанет генерится obj-шник
В VS 2005 Generate Preprocessor File (/P).
Re[2]: Два класса, имеющих указатели друг на друга