Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
atForce
10 / 11 / 3
Регистрация: 13.06.2015
Сообщений: 54
1

Два класса в одном заголовочном файле, предварительное объявление

21.09.2016, 16:18. Просмотров 1889. Ответов 6
Метки нет (Все метки)

Дико туплю, никак не могу понять, где косячу.
Ситуация - есть два описания классов в одном заголовочном файле (все делается с использованием Qt, но не думаю, что с ним проблема), причем второй унаследован от библиотечного, если это имеет значение. И я пытаюсь в классе А сделать поле типом которого будет класс В:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A
{
  public:
   A();
   ~A();
 
  private:
  B b;
};
 
class B : public QWidget
{
  public:
   B();
   ~B();
  private:
};
при компиляции валится ошибка "B does not name a type". Тут пока что понятно - класс В в этот момент еще неизвестен.
Делаю так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B;
 
class A
{
  public:
   A();
   ~A();
 
  private:
  B b;
};
 
class B : public QWidget
{
  public:
   B();
   ~B();
  private:
};
но тогда получаю ошибку "field 'b' has incomplete type".

Причем, если сначала описать класс В, а потом класс А, то все работает. Вопрос в том, как сделать предварительное объявление (или как называется этот фокус)? Если мне хочется сохранить последовательность описания классов.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2016, 16:18
Ответы с готовыми решениями:

Объявление класса в заголовочном файле
Здравствуйте. Столкнулся с тем что нужно скомпилировать библиотеку для C++. классы написал,...

Объявление поля класса в заголовочном файле
Здравствуйте! Подскажите пожалуйста, как сделать правильно. Есть класс А и класс B, в классе B...

Предварительное объявление класса
Имеется код такого вида: class IBase { public: virtual foo() = NULL; .. .. .. };

Предварительное объявление enum класса
В статье https://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html написано...

6
nmcf
6546 / 5767 / 2624
Регистрация: 14.04.2014
Сообщений: 24,505
21.09.2016, 16:32 2
Не получится так. Поменяй местами.
1
atForce
10 / 11 / 3
Регистрация: 13.06.2015
Сообщений: 54
21.09.2016, 16:39  [ТС] 3
nmcf, разве с++ не позволяет решить эту задачу? Печаль. Я думал, предварительное объявление для того и нужно.
0
shmkv
1318 / 480 / 67
Регистрация: 21.07.2015
Сообщений: 1,241
21.09.2016, 16:41 4
Получится через указатель. Но стоит ли оно того7
0
atForce
10 / 11 / 3
Регистрация: 13.06.2015
Сообщений: 54
21.09.2016, 16:52  [ТС] 5
shmkv, я рассчитывал на вариант попроще)
0
shmkv
1318 / 480 / 67
Регистрация: 21.07.2015
Сообщений: 1,241
21.09.2016, 16:57 6
Цитата Сообщение от atForce Посмотреть сообщение
я рассчитывал на вариант попроще)
Вариант попроще - разработка правильной структуры зависимостей. Иногда лечится раздельной компиляцией.
0
Байт
Эксперт C
22708 / 14391 / 3017
Регистрация: 24.12.2010
Сообщений: 30,659
21.09.2016, 17:01 7
Лучший ответ Сообщение было отмечено atForce как решение

Решение

atForce, Все логично. Если объявить так, то все понятно (транслятору)
C++
1
2
3
4
5
class B;
class A {
  ...
  class B *b;
};
На указатель выделяется всегда одинаковое количество байтов, а как устроен класс B - ему плевать.
А тут
C++
1
2
3
4
5
class B;
class A {
  ...
  class B b;
};
он совершенно в растерянности, сколько памяти надо выделять на данные класса B
2
21.09.2016, 17:01
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2016, 17:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Предварительное объявление для класса, помещенного в простанство
Пытаюсь сделать forward declaration для библиотечного класса ostream помещенного в namespace std....

Предварительное объявление классов. Вызвать функцию до реализации класса
Приветствую, народ. Пытаюсь реализовать структуру типа патерна "Посредник". И при реализации...

Объявление константы в заголовочном файле
Как объявить константу и массив в заголовочном файле? Map.h #pragma once #include...

Не могу объеявить экземпляр класса в заголовочном файле (qt, gcc)
Всем привет. Проблема состоит в следующем. Есть два класса - rule_class_common и...


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

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

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