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

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

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Наследование и конструктор с аргументами по умолчанию - C++

01.11.2013, 21:35. Просмотров 875. Ответов 14
Метки нет (Все метки)

Есть некоторый абстрактный класс "объект", который наследуют все объекты (код конструктора):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Object(const D3DXVECTOR3& position, 
        const D3DXVECTOR3& torsionAxis = D3DXVECTOR3(0.0f, 0.0f, 1.0f), const FLOAT& torsionAngle = 0.0f, const FLOAT& dTorsionAngle = 0.0f,
        const D3DXVECTOR3& rotationAngle = D3DXVECTOR3(0.0f, 0.0f, 0.0f), const D3DXVECTOR3& dRotationAngle = D3DXVECTOR3(0.0f, 0.0f, 0.0f))
    {
        this->position = position;
 
        this->rotationAngle = rotationAngle; 
        this->dRotationAngle = dRotationAngle;
 
        this->torsionAxis = torsionAxis;
        this->torsionAngle = torsionAngle; 
        this->dTorsionAngle = dTorsionAngle;
    }
как можно догадаться, главный параметр конструктора - позиция, всё остальное опционально. Эти "опциональные" параметры можно условно разбить на две категории - вращение вокруг собственной оси, и вращение вокруг произвольной (может быть выполнено одновременно).
При наследовании столкнулся не столь с проблемой, сколько с некрасивостью получающейся структуры что ли.. Дело в том, что, допустим, объект Sphere в таком случае в конструкторе помимо собственных параметров типа radius, должен брать и все эти параметры для Object конструктора, однако здесь я вижу два варианта:
1) Конструктор для сферы делается такой же, как для объекта (со значениями по умолчанию) + радиус и прочие.
---В этом случае выходит так, что при генерации параметров по умолчанию они будут переданы в конструктор объекта и, хотя параметры на самом деле не были переданы, объект будет думать, что ему передали параметры, хотя они и были взяты из значений по умолчанию конструктора класса сфера. Не очень то хорошо, разве нет?
2) Задать несколько, например, 4 конструктора класса сфера: без параметров со значениями по умолчанию, с параметрами первой группы (вращение вокруг собственной оси), с параметрами второй группы (вращение вокруг произвольной оси), с параметрами обоих групп (все параметры).
---В этом случае если я захочу добавить новые параметры, кол-во конструкторов будет увеличиваться в геометрической прогресси..

Какой подход применяют или, быть может, есть третий способ, который задают параметры по умолчанию, но, при этом, избегают недочетов этих двух?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2013, 21:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование и конструктор с аргументами по умолчанию (C++):

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Указатель на функцию с аргументами по умолчанию - C++
Можно ли вообще определить и записать подобное чудо?

Функция с двумя аргументами. Второй - по умолчанию = первому - C++
Привет! Есть какой - то способ задать в объявление функции второй аргумент, равный по умолчанию первому? :rofl: void...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
01.11.2013, 23:05 #2
Цитата Сообщение от nexen Посмотреть сообщение
Не очень то хорошо, разве нет?
А что плохого-то?

Цитата Сообщение от nexen Посмотреть сообщение
кол-во конструкторов будет увеличиваться в геометрической прогресси.
Вот это уже нехорошо. А так ли уж надо передавать все эти вещи в конструктор? Может, проще пользоваться отдельными операциями на уже сконструированном объекте тогда, когда это действительно нужно?
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
01.11.2013, 23:15 #3
Цитата Сообщение от nexen Посмотреть сообщение
Не очень то хорошо, разве нет?
Вполне нормально. Только вот параметры делайте по 1 на строку, дабы читать было удобно
Если часто надо будет генерировать объект, у которого все параметры кроме position по дефолту, тогда имеет смысл создать класс прослойку, единственная задача которого - брать и передавать позицию, а также вызывать конструктор Object с дефолтными значениями.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
02.11.2013, 11:11  [ТС] #4
Nick Alte, MrGluck, а если я захочу поменять зхначение по умолчанию, то неужели мне ручками придется во всех классах менять?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
02.11.2013, 11:17 #5
Цитата Сообщение от nexen Посмотреть сообщение
Nick Alte, MrGluck, а если я захочу поменять зхначение по умолчанию, то неужели мне ручками придется во всех классах менять?
можно прописать где нибудь в отдельном файле
C++
1
#define VAL1 100
или
C++
1
const int VAL1=100
и в конструкторе не конкретные цифры а эти "псевдонимы", тогда придется поменять только в одном месте
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.11.2013, 11:24 #6
мне кажется, вместо параметров по умолчанию удобнее написать несколько конструкторов, и вызывать один из другого. избавляет от многих неожиданностей.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
02.11.2013, 12:32  [ТС] #7
ValeryS, define это плохо :<
novi4ok, и в итоге будет n! конструкторов? Упаси..
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
02.11.2013, 12:33 #8
Цитата Сообщение от nexen Посмотреть сообщение
ValeryS, define это плохо :<
не всегда
вот для таких случаев само то
stzer
92 / 68 / 20
Регистрация: 26.10.2013
Сообщений: 204
Завершенные тесты: 2
02.11.2013, 12:50 #9
Цитата Сообщение от novi4ok Посмотреть сообщение
мне кажется, вместо параметров по умолчанию удобнее написать несколько конструкторов, и вызывать один из другого. избавляет от многих неожиданностей.
Вы хотите сказать, что в базовом классе можно описать конструктор копирования для полей данного класса, а в производных так же описать конструктор, но таким образов, чтобы вызывался конструктор из базового?
Например,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Base 
{
/*...*/
Base(const Base& object)
{
/*...*/
}
/*...*/
};
 
class B:public Base
{
/*...*/
B(const B& obj) : Base(obj)
{
/*...*/
}
/*...*/
};
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.11.2013, 14:15 #10
Цитата Сообщение от nexen Посмотреть сообщение
ValeryS, define это плохо :<
novi4ok, и в итоге будет n! конструкторов? Упаси..
при чем здесь упаси!
на практике имеется чаще всего несколько, перечислимых на пальцах одной ноги, вариантов создания объекта (или любой функции). если пишешь некий "хэлло уорлд!", или лабу какую на эту тему - можно применить. но когда задача и без этого имеет многомерное поле сложности, то эти дифолт-штучки-дрючки добавляют еще одно измерение, что не украшает жизнь красиво.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
02.11.2013, 14:31  [ТС] #11
novi4ok, ты мне предлагаешь сделать для иерархии из двух классов 9 конструкторов? (позиция, вращение вокруг своей оси и произвольной оси - 3 разных блока, которые нужно выделить в обоих классах. И это ещё если между собой не смешивать)
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.11.2013, 14:33 #12
Цитата Сообщение от stzer Посмотреть сообщение
Вы хотите сказать, что...
нет, я хочу сказеть, что вместо
C++
1
2
3
4
5
Cl::Cl (int a = 0, int b = 1, int c = 3)
: m_a (a)
, m_b (b)
, m_c (c)
{}
я предпочитаю
C++
1
2
3
4
5
6
7
8
9
10
Cl::Cl (int a, int b, int c)
: m_a (a)
, m_b (b)
, m_c (c)
{} 
Cl::Cl (int a)
: m_a (a)
, m_b (2)
, m_c (3)
{}
я раньше написал "вызывать один из другого", это была ошибка. я спутал с сишарп.
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
02.11.2013, 17:48 #13
Цитата Сообщение от ValeryS Посмотреть сообщение
не всегда
вот для таких случаев само то
для таких случаев второй способ, легче потом сообщения об ошибке писать.

Добавлено через 59 секунд
Цитата Сообщение от nexen Посмотреть сообщение
а если я захочу поменять зхначение по умолчанию, то неужели мне ручками придется во всех классах менять?
я написал про класс-прослойку. Менять надо будет лишь в нем.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
02.11.2013, 21:41  [ТС] #14
MrGluck, тогда, видимо, я вас не понял. Можете пример набросать "класса-прослойки"?
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
02.11.2013, 22:21 #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
 
class A
{
  public:
    A() {}
    A(const int a1, const int b1, const int c1, const int d1) :
        a(a1), b(b1), c(c1), d(d1) {}
    virtual ~A() {}
    virtual void print() const
    {
        std::cout << a << " " << b << " " << c << " " << d;
    }
 
  private:
    int a, b,c, d;
};
 
class B : public A
{
  public:
    B() : A() {}
    B(const int a1) : A(a1, defaultb, defaultc, defaultd) {}
    B(const int a1, const int b1, const int c1, const int d1) :
        A(a1, b1, c1, d1) {}
    virtual ~B() {}
 
  private:
    const static int defaultb = 0, defaultc = 0, defaultd = 0;
};
 
class C : public B
{
  public:
    C() {}
    C(const int a1, const int e1) : B(a1), e(e1) {}
    C(const int a1, const int b1, const int c1, const int d1, const int e1) :
        B(a1, b1, c1, d1), e(e1) {}
    virtual void print() const
    {
        A::print();
        std::cout << " " << e << std::endl;
    }
 
  private:
    int e;
};
 
 
int main()
{
    C c(1, 3);
    c.print();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2013, 22:21
Привет! Вот еще темы с ответами:

Зачем нужен конструктор объекта ostringstream (строковый поток который) с двумя аргументами? - C++
От него всё равно толку как от быка молока. А вроде как предназначен для записи чего-то там в строку... #include &lt;string&gt; #include...

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Конструктор по умолчанию - C++
У меня получается создавать конструктор по умолчанию если в хедере эти значения указаны: class Unit { protected: string name; ...

Конструктор по умолчанию - C++
Я то ли динамику недопоняла, то ли классы, то ли конструктор... И теперь совсем запуталась. Что нужно написать в конструкторе без...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.11.2013, 22:21
Ответ Создать тему
Опции темы

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