С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Forward declaration - C++

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

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

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

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

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


-
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 13:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Forward declaration (C++):

Forward declaration - C++
#ifndef __PROGTEST__ #include много инклудов using namespace std; #endif /* __PROGTEST__ */ template <typename _T, typename _E> ...

Forward declaration и рекурсивный include - C++
В обоих классах нужно использовать поля друг друга, при таком подходе: //Ship.h #include "Player.h"//Player.h - наследуется от...

Precompiled headers, STL forward declaration - C++
Та да :) Хотел уточнить кое - чего по прекомпайлам. Вот есть у меня файл stdafx.h для прекомпайл хедеров: #pragma once ...

Применение std::forward - C++
Хочу сделать внутри метода большой обьект. Затем передать его через return. Для этого хочу использовать move семантику. Верно ли данное...

C++11 - std::forward и static_assert - C++
Привет. Эта тема создана в познавательных целях. А именно, мне не совсем понятна реализация шаблонной функции std::forward. Вот так она...

Что такое forward декларация функции? - C++
Вот в этом примере узнал об этом : struct S { static int i; S() { ++i; } S(const S&) { ++i; } }; int...

13
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
13.01.2013, 14:06 #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;
}
1
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 14:25  [ТС] #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;
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
13.01.2013, 14:29 #4
Цитата Сообщение от Setneros Посмотреть сообщение
class B(A * aPointer)
Это что?
Цитата Сообщение от Setneros Посмотреть сообщение
B b(this);
А это?
0
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 14:54  [ТС] #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;
}
0
vxg
Модератор
3188 / 1991 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
13.01.2013, 15:06 #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;
};
1
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 15:25  [ТС] #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...
0
vxg
Модератор
3188 / 1991 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
13.01.2013, 15:35 #8
никто никого не создает. просто в классах есть указатели на объекты другого класса. вызвать метод можно через p->do_something()
1
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.01.2013, 15:36 #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()
{
  //...
}
1
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 15:41  [ТС] #10
Цитата Сообщение от vxg Посмотреть сообщение
никто никого не создает. просто в классах есть указатели на объекты другого класса. вызвать метод можно через p->do_something()
Вы видимо меня немного не допонимаете.
Мне не хочется создавать другой объект класса, когда уже есть один - класс, создавший текущий класс. Потому что это может быть затратно по ресурсам.

Мне нужен способ вызвать функцию этого создавшего текущий класс класса.
0
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 16:12  [ТС] #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 и скриншот ошибок.
0
Миниатюры
Forward declaration  
Вложения
Тип файла: zip TestDeclaration2.zip (5.0 Кб, 5 просмотров)
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
13.01.2013, 16:20 #12
класс объект, объект класс, у ТС каша в голове, вам в любом случае нужно будет 2 объекта иначе никак

Добавлено через 1 минуту
а еще можете попробовать сформулировать более глобальное задание, потому что скорее всего его можно решить иначе чем такая вот отвратительная конструкция
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
13.01.2013, 16:21 #13
Цитата Сообщение от Setneros Посмотреть сообщение
Попробовал, куча ошибок.
Вот точно такой код компилируется без проблем. Что-то, где-то Вы намудрили!
1
Setneros
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 9
13.01.2013, 16:25  [ТС] #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот точно такой код компилируется без проблем. Что-то, где-то Вы намудрили!

Да, простите, виноват.
Заголовочные два раза добавил. Странно, что Creator проглотил.
Вопрос решён, Спасибо!
0
13.01.2013, 16:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2013, 16:25
Привет! Вот еще темы с ответами:

Зачем в определении std::forward () нужен объект remove_reference? - C++
Зачем в определении std::forward() нужен объект remove_reference ? И почему не могут быть выведены аргументы шаблона? Я написал вот такой...

Какое сообщение появляется при нажатии на Forward As Attachment (OE)? - C++
Здравствуйте. Мне нужно отловить нажатие на Forward As Attachment в Outlook Express, это если правой кнопкой по письму и выбрать там...

Ошибка: Too many types is declaration - C++
Ребят нужна помощь. Начал смотреть ООП, пытаюсь писать какие то простые примеры, например: #include <iostream.h> #include <conio.h> ...

Ошибка! expected a declaration - C++
Кто знает, при написании кода постоянно вылетает ошибка expected a declaration, после часа гугления результата 0; 0:wall: class ship ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.