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

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

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
01.11.2013, 21:35     Наследование и конструктор с аргументами по умолчанию #1
Есть некоторый абстрактный класс "объект", который наследуют все объекты (код конструктора):
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++ Конструктор по умолчанию
Указатель на функцию с аргументами по умолчанию C++
C++ Конструктор по умолчанию
C++ Конструктор по умолчанию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
01.11.2013, 23:05     Наследование и конструктор с аргументами по умолчанию #2
Цитата Сообщение от nexen Посмотреть сообщение
Не очень то хорошо, разве нет?
А что плохого-то?

Цитата Сообщение от nexen Посмотреть сообщение
кол-во конструкторов будет увеличиваться в геометрической прогресси.
Вот это уже нехорошо. А так ли уж надо передавать все эти вещи в конструктор? Может, проще пользоваться отдельными операциями на уже сконструированном объекте тогда, когда это действительно нужно?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
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
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
02.11.2013, 11:17     Наследование и конструктор с аргументами по умолчанию #5
Цитата Сообщение от nexen Посмотреть сообщение
Nick Alte, MrGluck, а если я захочу поменять зхначение по умолчанию, то неужели мне ручками придется во всех классах менять?
можно прописать где нибудь в отдельном файле
C++
1
#define VAL1 100
или
C++
1
const int VAL1=100
и в конструкторе не конкретные цифры а эти "псевдонимы", тогда придется поменять только в одном месте
novi4ok
549 / 502 / 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
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
02.11.2013, 12:33     Наследование и конструктор с аргументами по умолчанию #8
Цитата Сообщение от nexen Посмотреть сообщение
ValeryS, define это плохо :<
не всегда
вот для таких случаев само то
stzer
38 / 59 / 17
Регистрация: 26.10.2013
Сообщений: 172
Завершенные тесты: 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
549 / 502 / 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
549 / 502 / 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
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, тогда, видимо, я вас не понял. Можете пример набросать "класса-прослойки"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2013, 22:21     Наследование и конструктор с аргументами по умолчанию
Еще ссылки по теме:

C++ Зачем нужен конструктор объекта ostringstream (строковый поток который) с двумя аргументами?
C++ Конструктор по умолчанию
Функция с двумя аргументами. Второй - по умолчанию = первому C++

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
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();
}
Yandex
Объявления
02.11.2013, 22:21     Наследование и конструктор с аргументами по умолчанию
Ответ Создать тему
Опции темы

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