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

Наследование, перегрузка, конструктор - C++

Восстановить пароль Регистрация
 
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
29.05.2013, 00:01     Наследование, перегрузка, конструктор #1
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class animal
{
public:
animal() { }
animal(int a) { age = a; }
~animal() { }
void set_age(int b) { age = b; }
int get_age() { return age; }
 
protected:
int age;
};
 
class dog: public animal
{
public:
dog() {  }
dog(int f) { weight = f; }
~dog() { }
void set_weight(int g) { weight = g; }
int get_weight() { return weight; }
    
protected:
int weight;
};
 
int main()
{
dog taksa(5);
 
std::cout << "age: " << taksa.get_age() << " weight: " << taksa.get_weight() << "\n";
 
system("pause");
return 0;
}


подскажите, как в данном случае присвоить значение переменной члену - age, без использования set_age(), а через конструктор?

единственно что мне пришло в голову в класс dog добавить еще один конструктор - dog(int h, int k) { weight = h; age = k; }

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class animal
{
public:
animal() { }
animal(int a) { age = a; }
~animal() { }
void set_age(int b) { age = b; }
int get_age() { return age; }
 
protected:
int age;
};
 
class dog: public animal
{
public:
dog() {  }
dog(int f) { weight = f; }
dog(int h, int k) { weight = h; age = k; }
~dog() { }
void set_weight(int g) { weight = g; }
int get_weight() { return weight; }
    
protected:
int weight;
};
 
int main()
{
dog taksa(5);
 
std::cout << "age: " << taksa.get_age() << " weight: " << taksa.get_weight() << "\n";
 
system("pause");
return 0;
}



существуют ли еще более простые и правильные способы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 00:01     Наследование, перегрузка, конструктор
Посмотрите здесь:

Наследование и конструктор. C++
C++ Наследование(Не вызывается конструктор)
Наследование и перегрузка << C++
Ромбовидное наследование. Конструктор внука. C++
C++ Наследование, конструктор класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
29.05.2013, 00:04     Наследование, перегрузка, конструктор #2
Цитата Сообщение от VLK Посмотреть сообщение
без использования set_age()
C++
1
age=значение;
Цитата Сообщение от VLK Посмотреть сообщение
а через конструктор?
C++
1
dog():animal(значение) {  }
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
29.05.2013, 00:05     Наследование, перегрузка, конструктор #3
C++
1
2
3
4
5
6
7
8
9
class Foo
{
    int val;
 
    public:
        Foo(int);
}
 
Foo::Foo(int v) : val(v) {}
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
29.05.2013, 00:08     Наследование, перегрузка, конструктор #4
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
#include <iostream>
 
class animal
{
public:
    animal(): age(0) {}
    animal(int a): age(a) {}
    virtual ~animal() {}
    void set_age(int b)
    { age = b; }
    int get_age()
    { return age; }
protected:
    int age;
};
 
class dog: public animal
{
public:
    dog(): animal(), weight(0) {}
    dog(int a, int w): animal(a), weight(w) {}
    ~dog() {}
    void set_weight(int g)
    { weight = g; }
    int get_weight()
    { return weight; }
protected:
    int weight;
};
 
int main()
{
    dog taksa(5, 50);
 
    std::cout << "age: " << taksa.get_age() << " weight: " << taksa.get_weight() << "\n";
 
    system("pause");
    return 0;
}
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
29.05.2013, 00:10  [ТС]     Наследование, перегрузка, конструктор #5
Цитата Сообщение от Olivеr Посмотреть сообщение

C++
1
dog(int a, int w): animal(a), weight(w) {}
это общепринятый стиль программирования? (хороший стиль программирования)
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
29.05.2013, 00:11     Наследование, перегрузка, конструктор #6
По Стенли Липпману - да
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
29.05.2013, 00:22  [ТС]     Наследование, перегрузка, конструктор #7
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class animal
{
public:
animal() { }
animal(int a) { age = a; }
~animal() { }
void set_age(int b) { age = b; }
int get_age() { return age; }
 
protected:
int age;
};
 
class dog: public animal
{
public:
dog() {  }
dog(int f) { weight = f; }
dog(int h, int z) { weight = h; animal(z); }
~dog() { }
void set_weight(int g) { weight = g; }
int get_weight() { return weight; }
    
protected:
int weight;
};
 
int main()
{
dog taksa(5,10);
 
std::cout << "age: " << taksa.get_age() << " weight: " << taksa.get_weight() << "\n";
 
system("pause");
return 0;
}


а почему не хочет работать? показывает на строчку 21 ( dog(int h, int z) { weight = h; animal(z); } ) и пишет - переопределение формального параметра "z".

что не так?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
29.05.2013, 00:24     Наследование, перегрузка, конструктор #8
Используйте списки инициализации конструкторов, как в постах 2 и 4.

Добавлено через 42 секунды
C++
1
2
animal() { }
animal(int a) { age = a; }
- это плохой стиль
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
29.05.2013, 00:25  [ТС]     Наследование, перегрузка, конструктор #9
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class animal
{
public:
animal() { }
animal(int a) { age = a; }
~animal() { }
void set_age(int b) { age = b; }
int get_age() { return age; }
 
protected:
int age;
};
 
class dog: public animal
{
public:
dog() {  }
dog(int f) { weight = f; }
dog(int h, int z):  weight(h), animal(z) { }
~dog() { }
void set_weight(int g) { weight = g; }
int get_weight() { return weight; }
    
protected:
int weight;
};
 
int main()
{
dog taksa(5,10);
 
std::cout << "age: " << taksa.get_age() << " weight: " << taksa.get_weight() << "\n";
 
system("pause");
return 0;
}


а так работает, когда изменил строчку 21 на - dog(int h, int z): weight(h), animal(z) { }, хотя суть не меняется, ох уж мне это программирование

Цитата Сообщение от Olivеr Посмотреть сообщение
Используйте списки инициализации конструкторов, как в постах 2 и 4.

Добавлено через 42 секунды
C++
1
2
animal() { }
animal(int a) { age = a; }
- это плохой стиль
за то как говорится не отходя от кассы, а не то что, сначала объявляешь метод, а потом после класса его расписываешь.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
29.05.2013, 00:26     Наследование, перегрузка, конструктор #10
так и должно быть. только порядок поменяйте: сначала должен создаваться базовый класс
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 03:50     Наследование, перегрузка, конструктор
Еще ссылки по теме:

Конструктор. Наследование. Список инициализации C++
Наследование и конструктор с аргументами по умолчанию C++
C++ Перегрузка и конструктор

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

Или воспользуйтесь поиском по форуму:
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
29.05.2013, 03:50     Наследование, перегрузка, конструктор #11
Все нормально:
C++
1
2
animal() {}
animal(int a): age(a) {}
Иначе до выполнения тела конструктора animal будут вызваны конструкторы по умолчанию для всех его членов, что приведет в лучшем случае к дополнительным расходам, в худшем - к ошибке компиляции, если у каких-то членов нет конструктора по умолчанию. Ну и нельзя будет инициализировать нужным значением родительский класс, как в примере выше.
Yandex
Объявления
29.05.2013, 03:50     Наследование, перегрузка, конструктор
Ответ Создать тему
Опции темы

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