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

ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.76
artem0711
 Аватар для artem0711
9 / 9 / 2
Регистрация: 25.08.2010
Сообщений: 67
Завершенные тесты: 1
08.01.2013, 11:00     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class A
{
protected:
    int i;
public:
    A(int);
    void show() { cout<<"Caller from A: i = "<<i<<endl; }
};
 
class B: public A
{
public:
    void show() { cout<<"Caller from B: i = "<<i<<endl; }
};
 
A::A(int j)
{
    i = j;
}
 
int main(int argc, char* argv[])
{
    A a(10);
    a.show();
    B b;
    b.show();
    system("pause");
    return 0;
}
В данном примере при компиляции будет ругаться:
15:7: ошибка: нет подходящей функции для вызова «A::A()»
15:7: замечание: candidates are:
21:1: замечание: A::A(int)
21:1: замечание: candidate expects 1 argument, 0 provided
6:7: замечание: A::A(const A&)
6:7: замечание: candidate expects 1 argument, 0 provided

Помогите разобраться, как всё-таки правильно вызвать создание объекта дочернего класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 11:00     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса
Посмотрите здесь:

C++ Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
C++ Вызов функции родительского класса в наследнике
Использование объекта одного класса при создании нового класса C++
Вызов конструктора шаблонного класса C++
C++ Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
08.01.2013, 11:09     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #2
Объявить конструктор класса A без параметров.
artem0711
 Аватар для artem0711
9 / 9 / 2
Регистрация: 25.08.2010
Сообщений: 67
Завершенные тесты: 1
08.01.2013, 11:12  [ТС]     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #3
Schizorb, другого решения быть не может?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
08.01.2013, 11:38     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #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
#include <iostream>
 
class MyClass{
public:
    MyClass(int var){
        std::cout<<"Base constructor (int)\n";
    }
    MyClass(){
        std::cout<<"Base constructor (void)\n";
    }
};
 
class ChClass: public MyClass{
public:
    ChClass():MyClass(){/////////////////////////////////
        std::cout<<"Chield constructor (void)\n";
    }
    ChClass(int var):MyClass(var){//////////////////////////////////////
        std::cout<<"Chield constructor (int)\n";
    }
};
 
int main(){
    ChClass ch1,cha(5);
    return 0;
}
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
08.01.2013, 11:59     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #5
Можно еще так:
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class A
{
protected:
    int i;
public:
    A(int j=0)
{
    i = j;
}
    void show() { cout<<"Caller from A: i = "<<i<<endl; }
};
 
class B: public A
{
public:
    void show() { cout<<"Caller from B: i = "<<i<<endl; }
};
 
 
 
int main(int argc, char* argv[])
{
    A a(10);
    a.show();
    B b;
    b.show();
    system("pause");
    return 0;
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
08.01.2013, 12:08     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #6
Цитата Сообщение от artem0711 Посмотреть сообщение
15:7: ошибка: нет подходящей функции для вызова «A::A()»
15:7: замечание: candidates are:
21:1: замечание: A::A(int)
21:1: замечание: candidate expects 1 argument, 0 provided
6:7: замечание: A::A(const A&)
6:7: замечание: candidate expects 1 argument, 0 provided
Если я правильно понимаю проблему, то беда вовсе не в отсутствии конструктора A без параметров, а в том, что для B не написан вообще никакой конструктор. В итоге компилятор сгенерил конструктор для B без параметров, который в процессе своей работы вызывает конструктор A без параметров (которого нет). И лечить проблему надо именно тем, что написать конструктор для B, который вызовет из-под себя конструктор A с параметром, а вовсе не так, как было здесь предложено

Добавлено через 1 минуту
Например, воткнуть его вовнутрь класса B (после "public:")

C++
1
    B() : A(7) { }
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,210
Записей в блоге: 11
08.01.2013, 13:10     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #7
Цитата Сообщение от Schizorb Посмотреть сообщение
Объявить конструктор класса A без параметров.
Плохо. Что за объект в этом случает получается?
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
08.01.2013, 13:15     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #8
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Что за объект в этом случает получается?
В смысле? Чем плох объект созданный конструктором без параметров?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.01.2013, 13:30     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #9
Цитата Сообщение от Schizorb Посмотреть сообщение
В смысле? Чем плох объект созданный конструктором без параметров?
Тем, что процессом конструирования нельзя управлять с помощью параметров?
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
08.01.2013, 13:38     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #10
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Тем, что процессом конструирования нельзя управлять с помощью параметров?
Так это само собой. Но я, допустим, вижу в коде у автора
C++
1
B b;
Без всяких параметров создается объект. Значит и конструктору базового класса, по логике, не нужны параметры. А если и нужны, то их отсюда не передать. Тогда соглашусь с Evg, можно создать конструктор для B, который вызовет конструктор А с каким-нибудь параметром.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,210
Записей в блоге: 11
08.01.2013, 22:05     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #11
Цитата Сообщение от Schizorb Посмотреть сообщение
В смысле? Чем плох объект созданный конструктором без параметров?
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
09.01.2013, 10:03     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #12
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
Берём класс, описывающий строку (или список). Очевидно, что конструктор по умолчанию создаёт пустую строку (или пустой список). А потому не надо проблему треугольника проецировать на всё программирование в целом
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
09.01.2013, 10:11     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #13
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
по умолчанию пустой треугольник, а к такому классу добавить методы инициализации его параметров,чем плохо, возможно на этапе инициализации нам известны не все параметры треугольника,а у нас например имеется метод который сделает ресайз треугольника чтоб вписать его в окружность, мы инициализируем пустой и вызываем метод ресайза, как пример
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,210
Записей в блоге: 11
09.01.2013, 10:17     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #14
Цитата Сообщение от Evg Посмотреть сообщение
Берём класс, описывающий строку (или список). Очевидно, что конструктор по умолчанию создаёт пустую строку (или пустой список). А потому не надо проблему треугольника проецировать на всё программирование в целом
Пустая строка/список это одно из естественных состояний.
Это не проблема треугольника, а проблема создания объекта. Берем класс описывающий человека, если кто-то предполагает наличия конструктора без параметров, то кто будет создан?

Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
по умолчанию пустой треугольник, а к такому классу добавить методы инициализации его параметров,чем плохо,
Тем, что пустых треугольников не существует. А потом еще надо не забыть присвоить ему корректное значение.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
09.01.2013, 10:32     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #15
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
А потом еще надо не забыть присвоить ему корректное значение.
это ответственность разработчика, и "пустой треугольник" будет в данном случае некая нематериальная абстракция, которую нужно материализовать,например чтоб класс добавить в vector, то у него должен быть конструктор по умолчанию, он может быть параметрическим, но какие вы туда параметры будете отдавать? не справедливо отдавать предпочтение какому либо треугольнику, поэтому лучше делать его "пустым" а иммено привести к точке задав все параметры 0, либо делать без параметров
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
09.01.2013, 10:33     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #16
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Берем класс описывающий треугольник.
Конкретно для треугольника может вообще и не нужен конструктор без параметров, или если нужно - пусть в нем задаются какие-то значения по умолчанию или нулевые, мало ли какая задача.

В данной задаче уже есть конструктор без параметров для класса B, какой объект при этом должен создаваться и чем будут инициализироваться его элементы, это уж как автор решит, что именно ему нужно. Спор, по-моему, ни о чем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2013, 15:13     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса
Еще ссылки по теме:

Вызов конструктора базового класса из класса-наследника C++
C++ Вызов конструктора класса
Может ли метод родительского класса обратиться к полю дочернего класса C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
09.01.2013, 15:13     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса #17
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Пустая строка/список это одно из естественных состояний.
Это не проблема треугольника, а проблема создания объекта. Берем класс описывающий человека, если кто-то предполагает наличия конструктора без параметров, то кто будет создан?
Потому я и говорю, что не надо один конкретный случай проецировать на всё программирование. Для одной абстракции конструтор без параметров логического смысла не имеет, для другой абстракции - имеет. Конкретно по поводу данной темы - ТС вообще только учит Си++ и разбирается, как он работает. А потому замечание, что "конкструктор без параметров не имеет смысла" вообще не в тему
Yandex
Объявления
09.01.2013, 15:13     ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса
Ответ Создать тему
Опции темы

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