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

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

Войти
Регистрация
Восстановить пароль
 
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
#1

Как использовать класс, определенный позднее? - C++

30.06.2011, 07:49. Просмотров 403. Ответов 8
Метки нет (Все метки)

как заюзать класс определенный позднее, пробую так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
class B;
 
class A{
  B b;
};
 
class B{};
 
int main(){
    
  return 0;
}
компилятор пишет следующее:

main.cpp(8) : error C2079: 'A::b' uses undefined class 'B'
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2011, 07:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как использовать класс, определенный позднее? (C++):

Может ли вообще на практике возникнуть ситуация, когда определенный класс следует указывать как друго самого себя? - C++
Может ли вообще на практике возникнуть ситуация, когда определенный класс следует указывать как друго самого себя?

Как использовать класс описанный в другом файле - C++
Есть проект, несколько файлов, в одном из них описаны классы. Как использовать эти классы в других файлах?

Как приведенный код использовать как класс - C++
Добрый день! проблема в следующем: char* charTypes = { &quot;Add&quot;, &quot;Min&quot;, &quot;Mul&quot;, &quot;Div&quot;, &quot;Mod&quot;,// базовые операции с числами &quot;EQ&quot;,...

Класс и конструктор с string или как использовать указатели. - C++
Есть такая вот ерунда class human { public: string name; string surname; int age; human(string *imya, string *familia,...

Как использовать вектор, содержащий указатели на класс, в этом же классе? - C++
Возникла необходимость обращения к объекту класса внутри класса с помощью вектора, содержащего указатели на объекты этого класса. ...

Класс, для полей которого нужно использовать класс - C++
Нужно помочь с этой частью, ну и проблемка - char для ФИО не переваривает пробелы. #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; ...

8
Bers
Заблокирован
30.06.2011, 08:02 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вы в принципе не можете использовать объект, который ещё не был определен, поскольку компилятор не сможет построить объект, не зная его размеров.

Но вы всегда можете использовать указатель на объект, потому что все указатели в сях весят одинакого:

C++
1
2
3
4
5
class B;
 
class A{
  B* b;
};
Я настоятельно рекомендую вам ознакомится с материалами "идиома pImpl"
Например, вот здесь: http://habrahabr.ru/blogs/refactoring/111602/
3
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
30.06.2011, 10:51  [ТС] #3
Цитата Сообщение от Bers Посмотреть сообщение
Вы в принципе не можете использовать объект, который ещё не был определен, поскольку компилятор не сможет построить объект, не зная его размеров.

Но вы всегда можете использовать указатель на объект, потому что все указатели в сях весят одинакого:

C++
1
2
3
4
5
class B;
 
class A{
  B* b;
};
попробовал ваш прием

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
class B;
 
class A{
  B * b;
public:
  A(){ b = new B; }
};
 
class B{};
 
int main(){
    
  return 0;
}
получаю:

error C2512: 'B' : no appropriate default constructor available

вот терь думаю почему это в классе B нет конструктора по умолчанию бред какойто...
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,388
30.06.2011, 11:03 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
class B;
 
class A{
  B * b;
public:
  A();
};
 
class B{};
 
A::A() { b = new B; }
 
int main(){
 
  return 0;
}
1
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
30.06.2011, 13:50  [ТС] #5
Цитата Сообщение от CheshireCat Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
class B;
 
class A{
  B * b;
public:
  A();
};
 
class B{};
 
A::A() { b = new B; }
 
int main(){
 
  return 0;
}
спасибо мил человек, работает. В чем только разница между твоим и моим кодом понять не могу? Вроди бы разница только в том что у меня встроенный (inline) конструктор, да и тот если в нем выделяется память должен стать обычным конструктором (по крайней мере так читал про это). Объясните в чем сабж...
0
Bers
Заблокирован
30.06.2011, 14:01 #6
Цитата Сообщение от pontakrin Посмотреть сообщение
A(){ b = new B; }
Разница в том, что у вас функция new уже строит объект, который ещё не был объявлен.
new запускает конструктор класса B.

А как компилятор узнает, как строить объект, если он не знает его внутреннего устройства???

А теперь обратите внимание:

C++
1
2
3
4
5
class B{}; //Теперь компилятор увидил объявление класса B,
               // и знает о его внутреннем устройства.
               //таким образом, компилятор уже знает размер класса B
 
A::A() { b = new B; }  //поэтому, теперь он может создавать объекты класса B
1
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
30.06.2011, 14:03 #7
В том, что A::A() { b = new B; } идет после объявления class B{};
Чтобы создать класс B нужно видеть сколько выделить памяти, то значит нужно видеть его внутренюю структуру для этого.
1
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
30.06.2011, 14:11  [ТС] #8
Цитата Сообщение от An1ka Посмотреть сообщение
В том, что A::A() { b = new B; } идет после объявления class B{};
Чтобы создать класс B нужно видеть сколько выделить памяти, то значит нужно видеть его внутренюю структуру для этого.
все просек, спасибо за подсказку. +1
0
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
30.06.2011, 14:22  [ТС] #9
Цитата Сообщение от Bers Посмотреть сообщение
Разница в том, что у вас функция new уже строит объект, который ещё не был объявлен.
new запускает конструктор класса B.

А как компилятор узнает, как строить объект, если он не знает его внутреннего устройства???

А теперь обратите внимание:

C++
1
2
3
4
5
class B{}; //Теперь компилятор увидил объявление класса B,
               // и знает о его внутреннем устройства.
               //таким образом, компилятор уже знает размер класса B
 
A::A() { b = new B; }  //поэтому, теперь он может создавать объекты класса B
большое спасибо за помощь.
0
30.06.2011, 14:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2011, 14:22
Привет! Вот еще темы с ответами:

Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него? - C++
Это указатель на класс figure *f Это перегрузка оператора void figure::operator (int i) { cout &lt;&lt; &quot;(&quot; &lt;&lt; massiv.x &lt;&lt; &quot;,&quot; &lt;&lt;...

Как использовать собственный класс в структуре struct до определения самого класса в тексте программы - C++
Проблема такая: хочу в структуре одним из элементов сделать класс. Проблема в том, что эта структура задается в самом начале текста...

Функция указатель на класс, определенный внутри шаблонного класса - C++
Доброго времени суток! Помогите пожалуйста разобрать со следующим кодом: template &lt;class T&gt; class List{ class Node{ public: ...

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


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

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

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