Два класса, имеющих указатели друг на друга
От: blacksun  
Дата: 30.09.08 14:44
Оценка:
cls1.h
#pragma once

#include "cls2.h"

class cls2;

class cls1
{
public:
    cls1() { test1 = 5; }
    int test1;
    cls2 * pCls2;

    void setp(cls2 *p);
};



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.cpp
#include "stdafx.h"
#include "cls1.h"

void cls1::setp(cls2 *p)
{
    pCls2 = p;
}


cls2.cpp

#include "stdafx.h"
#include "cls2.h"

void cls2::setp(cls1 *p)
{
    pCls1 = p;
}


simple.cpp
#include "stdafx.h"

#include "cls1.h"
#include "cls2.h"


int _tmain(int argc, _TCHAR* argv[])
{

    cls1 c1;
    cls2 c2;

    c2.setp(&c1);

    return 0;
}




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.
подскажите, как побороть проблему?
Re: Два класса, имеющих указатели друг на друга
От: hobby  
Дата: 30.09.08 15:05
Оценка:
Здравствуйте, blacksun, Вы писали:


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
...


вынеси prnt в .cpp
Re: Два класса, имеющих указатели друг на друга
От: BLo Россия  
Дата: 30.09.08 15:13
Оценка:
Здравствуйте, blacksun, Вы писали:

...

B>такое ощущение, что компилятор не знает, что у cls1 есть переменная test1.

B>подскажите, как побороть проблему?

Вынеси все зависимости одного класса от другого в срр. В h не делай ничего с зависимым классом.
Re: Два класса, имеющих указатели друг на друга
От: _VanGOG_ Украина  
Дата: 30.09.08 15:15
Оценка:
Здравствуйте, blacksun, Вы писали:

B>cls2.h

B>
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 Россия  
Дата: 30.09.08 15:23
Оценка:
кстати, а как узнать что получается из файла после работы препроцессора?
Re: Два класса, имеющих указатели друг на друга
От: blacksun  
Дата: 30.09.08 20:57
Оценка:
спасибо всем за ответы, разобрался.
Re[3]: Два класса, имеющих указатели друг на друга
От: Went  
Дата: 30.09.08 20:58
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>кстати, а как узнать что получается из файла после работы препроцессора?


Есть в настройках файла (в VC). Если включить, рядом с cpp-шником начнет генерится i-файл, показывающий результат препроцессинга. Но перестанет генерится obj-шник
Re: Два класса, имеющих указатели друг на друга
От: Bell Россия  
Дата: 01.10.08 03:05
Оценка:
Здравствуйте, blacksun, Вы писали:

К рекомендации выности все зависимые вещи в .срр — файлы стоит прислушаться, но в данном случае проблема решается, если убрать #include "cls2.h" из cls1.h.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Два класса, имеющих указатели друг на друга
От: alzt  
Дата: 01.10.08 06:30
Оценка: 3 (1)
Здравствуйте, Went, Вы писали:

W>Здравствуйте, Nik_1, Вы писали:


N_>>кстати, а как узнать что получается из файла после работы препроцессора?


W>Есть в настройках файла (в VC). Если включить, рядом с cpp-шником начнет генерится i-файл, показывающий результат препроцессинга. Но перестанет генерится obj-шник


В VS 2005 Generate Preprocessor File (/P).
Re[2]: Два класса, имеющих указатели друг на друга
От: alzt  
Дата: 01.10.08 06:30
Оценка:
Здравствуйте, blacksun, Вы писали:

B>спасибо всем за ответы, разобрался.


Спасибо тут принято в виде оценок выражать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.