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

как заюзать класс определенный позднее - C++

Восстановить пароль Регистрация
 
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
30.06.2011, 07:49     как заюзать класс определенный позднее #1
как заюзать класс определенный позднее, пробую так:

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'
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2011, 07:49     как заюзать класс определенный позднее
Посмотрите здесь:

C++ Позднее и раннее связывание
C++ Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
Может ли вообще на практике возникнуть ситуация, когда определенный класс следует указывать как друго самого себя? C++
C++ Раннее и позднее связывание
Организовать класс треугольник определенный по 3-ем сторонам содержащий методы нахождения периметра и площади(По формуле герона) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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/
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 нет конструктора по умолчанию бред какойто...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
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;
}
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) конструктор, да и тот если в нем выделяется память должен стать обычным конструктором (по крайней мере так читал про это). Объясните в чем сабж...
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
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
30.06.2011, 14:03     как заюзать класс определенный позднее #7
В том, что A::A() { b = new B; } идет после объявления class B{};
Чтобы создать класс B нужно видеть сколько выделить памяти, то значит нужно видеть его внутренюю структуру для этого.
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
30.06.2011, 14:11  [ТС]     как заюзать класс определенный позднее #8
Цитата Сообщение от An1ka Посмотреть сообщение
В том, что A::A() { b = new B; } идет после объявления class B{};
Чтобы создать класс B нужно видеть сколько выделить памяти, то значит нужно видеть его внутренюю структуру для этого.
все просек, спасибо за подсказку. +1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2011, 14:22     как заюзать класс определенный позднее
Еще ссылки по теме:

Функция указатель на класс, определенный внутри шаблонного класса C++
Создайте определенный пользователем класс Point, который содержит скрытые компоненты-данные xCoord и yCoord C++
Организовать класс треугольник, определенный по длинам трех сторон. Сделать ввод значений объектов C++

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

Или воспользуйтесь поиском по форуму:
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
большое спасибо за помощь.
Yandex
Объявления
30.06.2011, 14:22     как заюзать класс определенный позднее
Ответ Создать тему
Опции темы

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