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

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

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

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

01.11.2013, 21:35. Просмотров 866. Ответов 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++
Привет! Есть какой - то способ задать в объявление функции второй аргумент, равный по умолчанию первому? :rofl: void...

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

Конструктор по умолчанию - C++
Всем привет! Если в классе вообще нет конструктора, чем будут инициализироваться члены класса? И в чем отличие объект() и объект...

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

Конструктор по умолчанию - C++
Показывает ошибку : 1 IntelliSense: для класса "tovar" не существует конструктор по умолчанию Подскажите пожалуйста как сделать ...

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

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

Цитата Сообщение от nexen Посмотреть сообщение
кол-во конструкторов будет увеличиваться в геометрической прогресси.
Вот это уже нехорошо. А так ли уж надо передавать все эти вещи в конструктор? Может, проще пользоваться отдельными операциями на уже сконструированном объекте тогда, когда это действительно нужно?
MrGluck
Модератор
Эксперт CЭксперт С++
7149 / 4315 / 629
Регистрация: 29.11.2010
Сообщений: 11,730
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
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,722
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
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,722
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Эксперт С++
7149 / 4315 / 629
Регистрация: 29.11.2010
Сообщений: 11,730
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++
Здравствуйте, есть такой код: explicit RFileDownloader(QObject *parent = 0); explicit RFileDownloader(const QUrl &amp;url = QUrl(),...

Конструктор по умолчанию - C++
Доброе утро! При попытке доступа к данным-элементам объекта, созданного конструктором по умолчанию, программа загибается. Возникло...

Конструктор по умолчанию - C++
Здраститя. #include &lt;iostream&gt; using namespace std; class random { public: random(int b){a=b;} ~random(){} int...

Конструктор по умолчанию - C++
как использовать конструктор по умолчанию в конструкторе с параметром? К по умолчанию заполняет массив заранее определёнными символами, а...

Наследование и конструктор. - C++
Вот #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class String //базовый класс { protected: enum {SZ = 80...


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

Или воспользуйтесь поиском по форуму:
MrGluck
Модератор
Эксперт CЭксперт С++
7149 / 4315 / 629
Регистрация: 29.11.2010
Сообщений: 11,730
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     Наследование и конструктор с аргументами по умолчанию
Ответ Создать тему
Опции темы

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