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

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

Войти
Регистрация
Восстановить пароль
 
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
#1

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

29.05.2013, 00:01. Просмотров 624. Ответов 10
Метки нет (Все метки)

Кликните здесь для просмотра всего текста
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;
}



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

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

Наследование(Не вызывается конструктор) - C++
f3=f1+f2; 1) Вызывается Fraction operator+(const Fraction&amp; other) 2) Для возвращенного значения вызывается ProperFraction(const...

Наследование, конструктор класса - C++
Объясните мне пожалуйста, что значит такая конструкция: class CMyPaintDC:public CPaintDC { public: CMyPaintDC(CWnd* pWnd =...

Перегрузка и конструктор - C++
определение числа дней, прошедших между двумя датами (операция %); Написал программу и столкнулся с некоторой трудностью(не могу...

Наследование и перегрузка << - C++
Здравствуйте! Столкнулся со следующей проблемой: class A { int data,info; // .. public: friend void operator &lt;&lt;(ostream &amp;a,...

Ромбовидное наследование. Конструктор внука. - C++
если хотите, можете почитать код - он довольно объёмный...но однотипный #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; ...

10
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
29.05.2013, 00:04 #2
Цитата Сообщение от VLK Посмотреть сообщение
без использования set_age()
C++
1
age=значение;
Цитата Сообщение от VLK Посмотреть сообщение
а через конструктор?
C++
1
dog():animal(значение) {  }
0
xtorne21st
интересующийся
304 / 275 / 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) {}
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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;
}
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
29.05.2013, 00:10  [ТС] #5
Цитата Сообщение от Olivеr Посмотреть сообщение

C++
1
dog(int a, int w): animal(a), weight(w) {}
это общепринятый стиль программирования? (хороший стиль программирования)
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
29.05.2013, 00:11 #6
По Стенли Липпману - да
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
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".

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

Добавлено через 42 секунды
C++
1
2
animal() { }
animal(int a) { age = a; }
- это плохой стиль
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
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; }
- это плохой стиль
за то как говорится не отходя от кассы, а не то что, сначала объявляешь метод, а потом после класса его расписываешь.
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
29.05.2013, 00:26 #10
так и должно быть. только порядок поменяйте: сначала должен создаваться базовый класс
1
Гром
210 / 129 / 11
Регистрация: 20.03.2009
Сообщений: 1,103
Записей в блоге: 16
Завершенные тесты: 1
29.05.2013, 03:50 #11
Все нормально:
C++
1
2
animal() {}
animal(int a): age(a) {}
Иначе до выполнения тела конструктора animal будут вызваны конструкторы по умолчанию для всех его членов, что приведет в лучшем случае к дополнительным расходам, в худшем - к ошибке компиляции, если у каких-то членов нет конструктора по умолчанию. Ну и нельзя будет инициализировать нужным значением родительский класс, как в примере выше.
0
29.05.2013, 03:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 03:50
Привет! Вот еще темы с ответами:

Конструктор. Наследование. Список инициализации - C++
Если есть класс, который наследует другой класс, то как задать для конструктора список инициализации? class CKub { private: ...

Наследование и конструктор с аргументами по умолчанию - C++
Есть некоторый абстрактный класс &quot;объект&quot;, который наследуют все объекты (код конструктора): Object(const D3DXVECTOR3&amp; position, ...

Наследование от ofstream и перегрузка << - C++
Добрый день, гуглил на английском языке, но ответа не попалось. Предыстория: некий объекта принимает в качестве параметра ссылку на...

Наследование и перегрузка операторов. - C++
У меня есть базовый класс class myfloat { protected: int c; int z; void reduce(); public: myfloat(float num=0);


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

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

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