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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 101
#1

Наследование или создание класса в классе? - C++

05.02.2011, 15:24. Просмотров 1266. Ответов 11
Метки нет (Все метки)

У меня есть класс А и класс Б. В классе А я хочу создать объекты класса Б. Как лучше это сделать? Или лучше использовать наследование?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 15:49     Наследование или создание класса в классе? #2
вы понимаете, что такое наследование и агрегирование? используейте второе
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 101
05.02.2011, 15:56  [ТС]     Наследование или создание класса в классе? #3
Не знаю. Спрашиваю потому что не знаю,не изобретаю ли я велосипед.
Просто я хочу описать в одном классе другой класс.
У меня есть класс А. В классе А я объявляю класс Б. В классе А создаю объекты класса Б.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
05.02.2011, 16:02     Наследование или создание класса в классе? #4
Matlabist, покажи свою программу, посмотрим.
Евгений М.
1034 / 975 / 53
Регистрация: 28.02.2010
Сообщений: 2,818
Завершенные тесты: 2
05.02.2011, 16:03     Наследование или создание класса в классе? #5
Цитата Сообщение от Matlabist Посмотреть сообщение
В классе А я хочу создать объекты класса Б.
Подчеркнутая буква - ключевая. Однозначно создавать объекты класса Б как члены класса А.

Можно реальный пример (если есть)?
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 16:07     Наследование или создание класса в классе? #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CPoint
{
public:
    CPoint(double x, double y);
 
    double GetX()const;
    double GetY()const;
private:
    double m_x, m_y;
};
 
 
class CTriangle
{
public:
    CTriangle(CPoint const& p1, CPoint const& p2, CPoint const& p3);
 
    CPoint GetVertex(unsigned index)const;
private:
    CPoint m_p1, m_p2, m_p3;
};
Евгений М.
1034 / 975 / 53
Регистрация: 28.02.2010
Сообщений: 2,818
Завершенные тесты: 2
05.02.2011, 16:09     Наследование или создание класса в классе? #7
panicwassano, так и оставьте.
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 101
05.02.2011, 16:15  [ТС]     Наследование или создание класса в классе? #8
Выдает ошибку
B::B' : cannot access private member declared in class 'A::B'
Почему в самом классе нельзя описать?
Как сделать наследование правильно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
    A()
    {
         B* b1=new B();
         B* b2=new B();
         B* b3=new B();
    };
    class B
    {
        B()
        {
        };
    };
}
Чем это хуже вот этого

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CTriangle
{
class CPoint
{
public:
        CPoint(double x, double y);
 
        double GetX()const;
        double GetY()const;
private:
        double m_x, m_y;
};
 
public:
        CTriangle(CPoint const& p1, CPoint const& p2, CPoint const& p3);
 
        CPoint GetVertex(unsigned index)const;
private:
        CPoint m_p1, m_p2, m_p3;
};
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 16:19     Наследование или создание класса в классе? #9
так в чем вопрос то? при создании объекта А создадутся 3 объекта класса B. Класс B объяви до конструктора класса А.
lemegeton
2916 / 1345 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
05.02.2011, 16:36     Наследование или создание класса в классе? #10
Цитата Сообщение от Matlabist Посмотреть сообщение
Выдает ошибку
B::B' : cannot access private member declared in class 'A::B'
Где? В какой строке?

Цитата Сообщение от Matlabist Посмотреть сообщение
Почему в самом классе нельзя описать?
Можно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A {
 public:
  class B {
  };
  A() {
    b1 = new B;
    b2 = new B;
    b3 = new B;
  }
  ~A() {
    delete b1;
    delete b2;
    delete b3;
  }
 private:
  B *b1, *b2, *b3;
};
Цитата Сообщение от Matlabist Посмотреть сообщение
Как сделать наследование правильно?
В данном случае не нужно наследования, нужна агрегация. Это когда один объект включает в себя другие объекты.

Цитата Сообщение от Matlabist Посмотреть сообщение
Чем это хуже вот этого
По смыслу хуже. По смыслу, класс точка не уникален для класса треугольника. Класс точка может так же описывать точки, скажем, многоугольника. Поэтому по смыслу лучше сделать их раздельными.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class CPoint
{
public:
        CPoint(double x, double y)
          : m_x(x), m_y(y) {}
        double GetX() const { return m_x; }
        double GetY() const { return m_y; }
private:
        double m_x, m_y;
};
 
class CTriangle
{
public:
        CTriangle(CPoint const& p1, CPoint const& p2, CPoint const& p3)
          : m_p1(p1), m_p2(p2), m_p3(p3) {}
        CPoint GetVertex(unsigned index) const {
          // have no idea what this one does
        }
private:
        CPoint m_p1, m_p2, m_p3;
};
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
05.02.2011, 16:39     Наследование или создание класса в классе? #11
Matlabist, читай внимательно сообщения об ошибках. Компилятор для этого и сделан.
У тебя конструктор класса B объявлен как закрытый, т.е. private, следовательно класс A не имеет к нему доступа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2011, 16:42     Наследование или создание класса в классе?
Еще ссылки по теме:

C++ Структура программы или наследование, без использования конструктора базового класса
C++ Шаблон класса в классе
C++ Создание статического класса, или функции в namespace
Наследование. Очистка памяти в производном классе C++
C++ Создание класса в другом классе

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

Или воспользуйтесь поиском по форуму:
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 101
05.02.2011, 16:42  [ТС]     Наследование или создание класса в классе? #12
Где? В какой строке?
Нужно было класс объявить до конструктора.
Yandex
Объявления
05.02.2011, 16:42     Наследование или создание класса в классе?
Ответ Создать тему
Опции темы

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