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

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

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

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

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

У меня есть класс А и класс Б. В классе А я хочу создать объекты класса Б. Как лучше это сделать? Или лучше использовать наследование?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2011, 15:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование или создание класса в классе? (C++):

Создание класса в другом классе - C++
Приветствую всех. Уважаемые гуру, скажите можно ли создавать класс в теле друго класса? Причем создание "внутреннего" класса идет на...

Создание наследовательного класса(классы-наследование) - C++
Доброе время суток.Прошу помощи у специалистов,не могу реализовать программно задание. Создать Абстрактный базовый класс с виртуальной...

Создание своего класса исключений, наследование std::exception - C++
хотел создать свой класс исключений пронаследовав от std::exception, но немного запутался в конструкторах... конструктор же не наследуется,...

Структура программы или наследование, без использования конструктора базового класса - C++
Всем доброго времени суток. Снова прошу вас о помощи! Код располагается по ссылке в спойлере - не вставлю сюда, так как слишком...

Создание объекта класса в другом классе!!! - C++
//----------------------------------Address.h---------------------------------------------------- class Address { public: const...

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? - C++
#include <windows.h> #include <iostream> using namespace std; //Вот главный класс class A{ public: A (){}; class...

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

Можно реальный пример (если есть)?
0
panicwassano
592 / 560 / 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;
};
0
Евгений М.
1036 / 977 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
05.02.2011, 16:09 #7
panicwassano, так и оставьте.
0
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 102
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;
};
0
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.02.2011, 16:19 #9
так в чем вопрос то? при создании объекта А создадутся 3 объекта класса B. Класс B объяви до конструктора класса А.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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;
};
1
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
05.02.2011, 16:39 #11
Matlabist, читай внимательно сообщения об ошибках. Компилятор для этого и сделан.
У тебя конструктор класса B объявлен как закрытый, т.е. private, следовательно класс A не имеет к нему доступа.
0
Matlabist
2 / 2 / 0
Регистрация: 28.11.2010
Сообщений: 102
05.02.2011, 16:42  [ТС] #12
Где? В какой строке?
Нужно было класс объявить до конструктора.
0
05.02.2011, 16:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2011, 16:42
Привет! Вот еще темы с ответами:

Как в классе А у объекта класса B вызвать метод класса B ? - C++
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли в...

Создание сложной структуры или класса - C++
Народ я не специалист - поэтому писать желательно с коментарием Необходимо открыть файл и прочитать в некую структуру сам файл...

Создание статического класса, или функции в namespace - C++
создаю win окно, хотел обернуть api функции набором функций, начал делать через статический класс, а теперь думаю, зачем все это? может...

Наследование. Очистка памяти в производном классе - C++
Создаю базовый класс ParentClass, содержащий в качестве объекта массив (выделяется динамический массив в зависимости от указанного...


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

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

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