Есть два класса, 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" включен.
Буду очень благодарен за объяснение в чем я затупил.
Здравствуйте, muzhig, Вы писали:
class class2;
class class1
{
class2* o;
};
Не?
Здравствуйте, 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;
Здравствуйте, cpp-coder, Вы писали:
CC>Здравствуйте, muzhig, Вы писали:
CC>CC>class class2;
CC>class class1
CC>{
CC> class2* o;
CC>};
CC>
CC>Не?
Точно, спасибо!