Форум программистов, компьютерный форум CyberForum.ru

Forward declaration - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.97
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 13:57     Forward declaration #1
Привет!
Есть два класса, один создаёт другой и передаёт в него ссылку на самого себя, чтобы тот мог вызывать некоторые функции первого. Получается такое перекрёстное использование.

Но, проблемы с компиляцией:
ISO C++ forbids declaration of 'мой класс' with no type

Я прочитал, что надо вместо #include "мой класс.h" вставить class мой класс; но это тоже не помогло:
forward declaration of 'struct мой класс'

Можете помочь с инфой как правильно декларировать в таком случае? Нужно решение независимо от компилятора.
Благодарю!


-
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
13.01.2013, 14:06     Forward declaration #2
Цитата Сообщение от Setneros Посмотреть сообщение
Можете помочь с инфой как правильно декларировать в таком случае? Нужно решение независимо от компилятора.
Благодарю!
А код?
Что-то мне подсказывает, что в объявлении класса Вы пытаетесь написать реализацию. Распихайте реализацию по разным .cpp, объявления по разным .h и опережающие объявления поставьте.
И еще - необходимо в классе делать указатели на классы, а не объекты классов. Иначе банально ничего работать не будет.
То есть вот так не получится:
C++
1
2
3
4
5
6
7
8
9
10
class B;
class A{
    B b;
};
class B{
    A a;
};
int main() {
    A a;
}
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 14:25  [ТС]     Forward declaration #3
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
class B;
class A{
    B b;
};
class B{
    A a;
};
int main() {
    A a;
}
Мой случай:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
B.h
#include "A.h"
class B(A * aPointer)
{
    //  Some with aPointer
}
 
 
A.h
#include "B.h"
class A
{
    B b(this);
}
 
 
main.cpp
#include "A.h"
int main() {
    A a;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
13.01.2013, 14:29     Forward declaration #4
Цитата Сообщение от Setneros Посмотреть сообщение
class B(A * aPointer)
Это что?
Цитата Сообщение от Setneros Посмотреть сообщение
B b(this);
А это?
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 14:54  [ТС]     Forward declaration #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Это что?

А это?
Указатель породившего класса
Мне нужно выполнять некоторые функции A класса находясь внутри B класса

Добавлено через 23 минуты
Извиняюсь, может быть непонятно написал, теперь исправил:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
B.h
#include "A.h"
class B
{
     B(A * aPointer);
}
 
 
A.h
#include "B.h"
class A
{
    B b(this);
}
 
 
main.cpp
#include "A.h"
int main() {
    A a;
}
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
13.01.2013, 15:06     Forward declaration #6
Цитата Сообщение от Setneros Посмотреть сообщение
B b(this)
запись не имеет смысла + вам уже сказали что при таком опережающем использовании нельзя возвращать объекты (нужно возвращать указатели).
C++
1
2
3
4
5
6
7
8
9
class a;
class b
{
    a *p;
};
class a
{
    b *p;
};
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 15:25  [ТС]     Forward declaration #7
Цитата Сообщение от vxg Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
class a;
class b
{
    a *p;
};
class a
{
    b *p;
};

Как тогда в классе b вызвать функцию породившего его класса a?
В вашем коде я вижу что a создаёт b, но b не имеет доступа к функциям и данным конкретно породившего его класса a...
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
13.01.2013, 15:35     Forward declaration #8
никто никого не создает. просто в классах есть указатели на объекты другого класса. вызвать метод можно через p->do_something()
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.01.2013, 15:36     Forward declaration #9
сказали же нужно просто растащить правильно по h и cpp файлам:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// B.h
class A;
class B
{
public:
    B(A* a);
};
 
// A.h
class A
{
public:
    A();
 
    void foo();
};
 
// B.cpp
#include "A.h"
#include "B.h"
B::B(A* a)
{
    a->foo();
}
 
// A.cpp
#include "A.h"
#include "B.h"
A::A()
{
    B b(this);
}
 
void A::foo()
{
  //...
}
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 15:41  [ТС]     Forward declaration #10
Цитата Сообщение от vxg Посмотреть сообщение
никто никого не создает. просто в классах есть указатели на объекты другого класса. вызвать метод можно через p->do_something()
Вы видимо меня немного не допонимаете.
Мне не хочется создавать другой объект класса, когда уже есть один - класс, создавший текущий класс. Потому что это может быть затратно по ресурсам.

Мне нужен способ вызвать функцию этого создавшего текущий класс класса.
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 16:12  [ТС]     Forward declaration #11
Цитата Сообщение от DU Посмотреть сообщение
сказали же нужно просто растащить правильно по h и cpp файлам:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// B.h
class A;
class B
{
public:
    B(A* a);
};
 
// A.h
class A
{
public:
    A();
 
    void foo();
};
 
// B.cpp
#include "A.h"
#include "B.h"
B::B(A* a)
{
    a->foo();
}
 
// A.cpp
#include "A.h"
#include "B.h"
A::A()
{
    B b(this);
}
 
void A::foo()
{
  //...
}
Попробовал, куча ошибок.
Вот проект на Qt и скриншот ошибок.
Миниатюры
Forward declaration  
Вложения
Тип файла: zip TestDeclaration2.zip (5.0 Кб, 5 просмотров)
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
13.01.2013, 16:20     Forward declaration #12
класс объект, объект класс, у ТС каша в голове, вам в любом случае нужно будет 2 объекта иначе никак

Добавлено через 1 минуту
а еще можете попробовать сформулировать более глобальное задание, потому что скорее всего его можно решить иначе чем такая вот отвратительная конструкция
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
13.01.2013, 16:21     Forward declaration #13
Цитата Сообщение от Setneros Посмотреть сообщение
Попробовал, куча ошибок.
Вот точно такой код компилируется без проблем. Что-то, где-то Вы намудрили!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2013, 16:25     Forward declaration
Еще ссылки по теме:

C++ C++11 - std::forward и static_assert
C++ Precompiled headers, STL forward declaration
C++ Forward declaration

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 16:25  [ТС]     Forward declaration #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот точно такой код компилируется без проблем. Что-то, где-то Вы намудрили!

Да, простите, виноват.
Заголовочные два раза добавил. Странно, что Creator проглотил.
Вопрос решён, Спасибо!
Yandex
Объявления
13.01.2013, 16:25     Forward declaration
Ответ Создать тему
Опции темы

Текущее время: 06:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru