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

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

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

Forward declaration - C++

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

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

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

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

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


-
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 13:57     Forward declaration
Посмотрите здесь:

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 ...

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 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Эксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 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
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,427
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
Модератор
3138 / 1940 / 214
Регистрация: 13.01.2012
Сообщений: 7,427
13.01.2013, 15:35     Forward declaration #8
никто никого не создает. просто в классах есть указатели на объекты другого класса. вызвать метод можно через p->do_something()
DU
1481 / 1057 / 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Эксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 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
Еще ссылки по теме:

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

Declaration terminated incorrectly - C++
#include<stdio.h> { int a,b,c; a=5; b=7; c=a*b; printf("multiplication=%d\n",c); } Помогите пожалуйста найти...

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

(7,3):Declaration syntax error - C++
Помогите исправить ошибку #include <stdio.h> #include <conio.h> main() { int a,b; int Cube (int n) { return n*n*n; ...

declaration terminated incorrectly - C++
Делал лабу на C++ и возникла проблема - "declaration terminated incorrectly", Кто-нибудь может сказать в чем ошибка? Задача в том что бы...


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

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

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