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

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

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

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

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

C++ Позднее и раннее связывание
Как заменить определенный символ на номера попорядку? C++
Может ли вообще на практике возникнуть ситуация, когда определенный класс следует указывать как друго самого себя? C++
C++ Как удалить определенный файл?
C++ Раннее и позднее связывание
Организовать класс треугольник определенный по 3-ем сторонам содержащий методы нахождения периметра и площади(По формуле герона) C++
Функция указатель на класс, определенный внутри шаблонного класса 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
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
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     как заюзать класс определенный позднее
Еще ссылки по теме:

Создайте определенный пользователем класс Point, который содержит скрытые компоненты-данные xCoord и yCoord C++
Организовать класс треугольник, определенный по длинам трех сторон. Сделать ввод значений объектов C++
C++ Найти в массиве сведений о компьютерах такой, который был выпущен позднее других
Как сравнить определенный символ двух строк? C++
C++ Как открыть определенный файл через shellexecute?

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

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

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