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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.97
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
#1

Forward declaration - C++

13.01.2013, 13:57. Просмотров 5024. Ответов 13
Метки нет (Все метки)

Привет!
Есть два класса, один создаёт другой и передаёт в него ссылку на самого себя, чтобы тот мог вызывать некоторые функции первого. Получается такое перекрёстное использование.

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

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

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


-
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 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
Модератор
3062 / 1864 / 196
Регистрация: 13.01.2012
Сообщений: 7,087
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
Модератор
3062 / 1864 / 196
Регистрация: 13.01.2012
Сообщений: 7,087
13.01.2013, 15:35     Forward declaration #8
никто никого не создает. просто в классах есть указатели на объекты другого класса. вызвать метод можно через p->do_something()
DU
1480 / 1056 / 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
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
13.01.2013, 16:20     Forward declaration #12
класс объект, объект класс, у ТС каша в голове, вам в любом случае нужно будет 2 объекта иначе никак

Добавлено через 1 минуту
а еще можете попробовать сформулировать более глобальное задание, потому что скорее всего его можно решить иначе чем такая вот отвратительная конструкция
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,950
Записей в блоге: 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++ Precompiled headers, STL forward declaration
C++ Ошибка: Too many types is declaration
C++ Forward declaration
C++ Ошибка! expected a declaration
Применение std::forward C++

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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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