Два класса, хранящие указатели друг на друга.
От: muzhig  
Дата: 21.05.11 10:54
Оценка:
Есть два класса, class1 и class2.
У обоих классов есть атрибут, хранящий указатель на экземпляр другого класса.
Лично я не вижу никаких логических проблем для этого(может быть изза неопытности), но компилироваться это отказывается.

вот код:
class1.h:
#ifndef CLASS1_H
#define CLASS1_H

#include <QObject>
#include "class2.h"
class class1 : public QObject
{
    Q_OBJECT
    class2* o;
public:
    explicit class1(QObject *parent = 0);
signals:
public slots:
};

#endif // CLASS1_H


class2.h то же самое, только наоборот:
#ifndef CLASS2_H
#define CLASS2_H

#include <QObject>
#include "class1.h"
class class2 : public QObject
{
    Q_OBJECT
    class1* o;
public:
    explicit class2(QObject *parent = 0);
signals:
public slots:
};
#endif // CLASS2_H


текст ошибки:

In file included from ../untitled6/class1.h:5,
                 from ../untitled6/class1.cpp:1:
../untitled6/class2.h:9: error: ISO C++ forbids declaration of 'class1' with no type
../untitled6/class2.h:9: error: expected ';' before '*' token



Компилятор спотыкается на том месте где class2 объявляет член-указатель еа class1, мол такой класс не объявлен, хотя заголовок "class1.h" включен.

Буду очень благодарен за объяснение в чем я затупил.
Re: Два класса, хранящие указатели друг на друга.
От: cpp-coder  
Дата: 21.05.11 11:09
Оценка: 3 (1) +1
Здравствуйте, muzhig, Вы писали:

class class2;

class class1
{
    class2* o;
};



Не?
Re: Два класса, хранящие указатели друг на друга.
От: ZegSoft Россия  
Дата: 21.05.11 13:48
Оценка:
Здравствуйте, muzhig, Вы писали:

M>Есть два класса, class1 и class2.

M>У обоих классов есть атрибут, хранящий указатель на экземпляр другого класса.
M>Лично я не вижу никаких логических проблем для этого(может быть изза неопытности), но компилироваться это отказывается.

M>вот код:

M>class1.h:
M>
M>#ifndef CLASS1_H
M>#define CLASS1_H

M>#include <QObject>
M>#include "class2.h"
M>class class1 : public QObject
M>{
M>    Q_OBJECT
M>    class2* o;
M>public:
M>    explicit class1(QObject *parent = 0);
M>signals:
M>public slots:
M>};

M>#endif // CLASS1_H
M>


M>class2.h то же самое, только наоборот:

M>
M>#ifndef CLASS2_H
M>#define CLASS2_H

M>#include <QObject>
M>#include "class1.h"
M>class class2 : public QObject
M>{
M>    Q_OBJECT
M>    class1* o;
M>public:
M>    explicit class2(QObject *parent = 0);
M>signals:
M>public slots:
M>};
M>#endif // CLASS2_H
M>


M>текст ошибки:


M>
M>In file included from ../untitled6/class1.h:5,
M>                 from ../untitled6/class1.cpp:1:
M>../untitled6/class2.h:9: error: ISO C++ forbids declaration of 'class1' with no type
M>../untitled6/class2.h:9: error: expected ';' before '*' token
M>



M>Компилятор спотыкается на том месте где class2 объявляет член-указатель еа class1, мол такой класс не объявлен, хотя заголовок "class1.h" включен.


M>Буду очень благодарен за объяснение в чем я затупил.



Проблема в том, что у тебя циклические зависимости получаются:
файл class1.h инклудит файл class2.h, который в свою очередь инклудит class1.h ну и так далее.
Для предотвращения этого,

#include "class1.h"


и

#include "class2.h"


лучше прописать не в заголовочных файлах, а в *.cpp
в заголовочных же файлах место

#include "class1.h"


лучше написать

class class1;


а вместо

#include "class1.h"


написать

class class2;
Re[2]: Два класса, хранящие указатели друг на друга.
От: muzhig  
Дата: 21.05.11 16:45
Оценка:
Здравствуйте, cpp-coder, Вы писали:

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


CC>
CC>class class2;

CC>class class1
CC>{
CC>    class2* o;
CC>};

CC>



CC>Не?

Точно, спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.