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

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

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

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

19.04.2013, 18:08. Просмотров 425. Ответов 7
Метки нет (Все метки)

Подскажите, пожалуйста, можно-ли делать так:

C++
1
2
3
4
5
6
class A {
  public:
    B objB;
};
 
class B : public A {};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 18:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно-ли наследовать класс, в котором определен объект текущего класса? (C++):

Создать класс, в котором можно сохранить любой вызываемый объект или функцию - C++
Возникла идея создать класс, в котором можно сохранить любой вызываемый объект или функцию. Что то наподобие std::function, но только не...

От класса String наследовать новый класс, который имеет проверку на превышение размера строки - C++
Доброго времени суток! Решаю задачи из учебника Роберта Лафоре ООП в C++. До этой задачи все решал сам и успешно, а тут встал в...

Передача указателя в класс на объект другого класса - C++
Не могу передать ссылку на объект класса в другой класс main.cpp #include <iostream> #include "test\class_a.h" #include...

Класс: строка. Не считывает данные во второй объект класса! - C++
Ребят, собственно, я упускаю, видимо, какую-то важную деталь, только КАКУЮ? В первый объект считывается строка, всё здорово, отображается -...

Класс строк, перегрузка операторов. Как вернуть объект класса - C++
Коротко: # include "MyString.h" void main () { My_String Address; Address = "Link"; Res = Address + "OoO"; } # ifndef...

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

7
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2013, 18:14 #2
Нет. При наследовании все члены предка становятся членами потомка, то есть
C++
1
2
3
4
5
6
7
8
9
10
11
class A {
  public:
   B objB;
int a;
int v;
int c;
};
class B : public A {
protect
int d;
};
просто сокращает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A {
  public:
   B objB;
int a;
int v;
int c;
};
class B :
protect
int d;
  public:
   B objB;
int a;
int v;
int c;
};
и разрешает указателю на A указывать на B, но объект (в данном случае objB) не может быть членом своего класса, рекурсия типов разрешена только для указателей.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,544
Завершенные тесты: 3
19.04.2013, 20:02 #3
dimkaok,
C++
1
2
3
4
5
6
class A {
  public:
    B objB;
};
 
class B : public A {};
Это просто не скомпилируется потому что B неполный тип в объявлении класса A.
0
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
19.04.2013, 21:20  [ТС] #4
А что в таком случае делать?

C++
1
2
3
4
5
6
// CMove.h
#include "CMessages.h"
class CMove {   
  public:
      CMessages o_messageBox;  // Объявляю объект в первом месте, где он понадобился
};
C++
1
2
3
4
5
6
7
8
// CPlayer.h
#include "CMove.h"
class CPlayer : public CMove {     // Если убрать public CMove..
  public:
     void eat() {   
    o_messageBox.youAreEatFood(); //.. то здесь для o_messageBox выдаст, что идентификатор не определен
     }
};
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2013, 21:22 #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Это просто не скомпилируется потому что B неполный тип в объявлении класса A.
ну написать перед всем этим
C++
1
class B;
не проблема. Но запрещена сама рекурсия типа.
0
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
19.04.2013, 21:22  [ТС] #6
Может можно получить доступ к o_messageBox другим способом, без наследования?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2013, 21:26 #7
Цитата Сообщение от dimkaok Посмотреть сообщение
А что в таком случае делать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// CMove.h
#include "CMessages.h"
class CMove { * 
* public:
* * * CMessages o_messageBox; *// Объявляю объект в первом месте, где он понадобился
};
// CPlayer.h
#include "CMove.h"
class CPlayer : public CMove { * * // Если убрать public CMove..
* public:
* * *void eat() { * 
* * o_messageBox.youAreEatFood(); //.. то здесь для o_messageBox выдаст, что идентификатор не определен
* * *}
};
А в чём проблема? Здесь в предковый класс агрегирован экземпляр не потомка, а третьего класса:
C++
1
2
3
4
5
6
7
8
9
10
11
class C
{
};
class A
{
 public:
  C c;
};
class B : public A
{
};
. Так вот, это разрешено.
0
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
19.04.2013, 21:50  [ТС] #8
Можете посмотреть мой код? Там все дописал, осталось только ошибки исправить.
Или хотя-бы покритикуйте, что не так, буду рад
0
Вложения
Тип файла: zip C++ RPG 1.2.2.zip (13.8 Кб, 5 просмотров)
19.04.2013, 21:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 21:50
Привет! Вот еще темы с ответами:

Можно ли удалить объект экземпляра класса из самого себя? - C++
Привет! Допустим: class TEST { public: TEST(); ~TEST(); void DelMe() {

Можно ли в поле private сконструировать объект с параметрами другого класса? - C++
Например у меня есть классы Basic и Second. Во 2-м классе есть конструктор с параметрами. Можно ли написать что-то типу такого? class...

Создать класс. Символьное поле должно быть задано как объект класса string - C++
решите задачку!) 6. Создать класс. Символьное поле должно быть задано как объект класса string. Написать конструктор по умолчанию,...

Объект внутри класса. Напишите класс Geo, моделирующий географические координаты на поверхности Земли - C++
Ребят, помогите решить задачу, пожалуйста. Чтт никак не получается :( Напишите класс Geo, моделирующий географические координаты на...


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

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

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