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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.76
artem0711
17 / 17 / 8
Регистрация: 25.08.2010
Сообщений: 89
Завершенные тесты: 1
#1

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

08.01.2013, 11:00. Просмотров 5127. Ответов 16
Метки нет (Все метки)

Здравствуйте!
Столкнулся с такой проблемой: если есть родительский класс с конструктором, то при создании дочернего объекта от этого класса не получается вызвать этот конструктор родительского класса. Может запутанно описал проблему, попытался накидать небольшой пример, может из него понятнее будет:
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

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

Вызов конструктора родительского класса - C++
Здравствуйте, столкнулся с такой проблемой: при вызове конструктора класса потомка (Derv1) через наследование конструктора из базового...

Вызов конструктора из родительского класса - C++
Как вызвать конструктор для производного класса из родительского?

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён? - C++
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую обращение ч/з пространство имён класса &quot;D::&quot; ...

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

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса? - C++
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и вызывается в его конструкторе (камень...

Использование объекта одного класса при создании нового класса - C++
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так: в приватной части...

16
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
08.01.2013, 11:09 #2
Объявить конструктор класса A без параметров.
0
artem0711
17 / 17 / 8
Регистрация: 25.08.2010
Сообщений: 89
Завершенные тесты: 1
08.01.2013, 11:12  [ТС] #3
Schizorb, другого решения быть не может?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
08.01.2013, 11:38 #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;
}
2
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
08.01.2013, 11:59 #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;
}
1
Evg
Эксперт CАвтор FAQ
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
08.01.2013, 12:08 #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) { }
1
Dmitriy_M
1363 / 1246 / 114
Регистрация: 20.03.2009
Сообщений: 4,462
Записей в блоге: 11
08.01.2013, 13:10 #7
Цитата Сообщение от Schizorb Посмотреть сообщение
Объявить конструктор класса A без параметров.
Плохо. Что за объект в этом случает получается?
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
08.01.2013, 13:15 #8
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Что за объект в этом случает получается?
В смысле? Чем плох объект созданный конструктором без параметров?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.01.2013, 13:30 #9
Цитата Сообщение от Schizorb Посмотреть сообщение
В смысле? Чем плох объект созданный конструктором без параметров?
Тем, что процессом конструирования нельзя управлять с помощью параметров?
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
08.01.2013, 13:38 #10
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Тем, что процессом конструирования нельзя управлять с помощью параметров?
Так это само собой. Но я, допустим, вижу в коде у автора
C++
1
B b;
Без всяких параметров создается объект. Значит и конструктору базового класса, по логике, не нужны параметры. А если и нужны, то их отсюда не передать. Тогда соглашусь с Evg, можно создать конструктор для B, который вызовет конструктор А с каким-нибудь параметром.
0
Dmitriy_M
1363 / 1246 / 114
Регистрация: 20.03.2009
Сообщений: 4,462
Записей в блоге: 11
08.01.2013, 22:05 #11
Цитата Сообщение от Schizorb Посмотреть сообщение
В смысле? Чем плох объект созданный конструктором без параметров?
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
0
Evg
Эксперт CАвтор FAQ
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
09.01.2013, 10:03 #12
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
Берём класс, описывающий строку (или список). Очевидно, что конструктор по умолчанию создаёт пустую строку (или пустой список). А потому не надо проблему треугольника проецировать на всё программирование в целом
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
09.01.2013, 10:11 #13
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
по умолчанию пустой треугольник, а к такому классу добавить методы инициализации его параметров,чем плохо, возможно на этапе инициализации нам известны не все параметры треугольника,а у нас например имеется метод который сделает ресайз треугольника чтоб вписать его в окружность, мы инициализируем пустой и вызываем метод ресайза, как пример
1
Dmitriy_M
1363 / 1246 / 114
Регистрация: 20.03.2009
Сообщений: 4,462
Записей в блоге: 11
09.01.2013, 10:17 #14
Цитата Сообщение от Evg Посмотреть сообщение
Берём класс, описывающий строку (или список). Очевидно, что конструктор по умолчанию создаёт пустую строку (или пустой список). А потому не надо проблему треугольника проецировать на всё программирование в целом
Пустая строка/список это одно из естественных состояний.
Это не проблема треугольника, а проблема создания объекта. Берем класс описывающий человека, если кто-то предполагает наличия конструктора без параметров, то кто будет создан?

Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
по умолчанию пустой треугольник, а к такому классу добавить методы инициализации его параметров,чем плохо,
Тем, что пустых треугольников не существует. А потом еще надо не забыть присвоить ему корректное значение.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
09.01.2013, 10:32 #15
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
А потом еще надо не забыть присвоить ему корректное значение.
это ответственность разработчика, и "пустой треугольник" будет в данном случае некая нематериальная абстракция, которую нужно материализовать,например чтоб класс добавить в vector, то у него должен быть конструктор по умолчанию, он может быть параметрическим, но какие вы туда параметры будете отдавать? не справедливо отдавать предпочтение какому либо треугольнику, поэтому лучше делать его "пустым" а иммено привести к точке задав все параметры 0, либо делать без параметров
0
09.01.2013, 10:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2013, 10:32
Привет! Вот еще темы с ответами:

Неявный вызов конструктора шаблонного класса при операции сравнения - C++
Реализовал шаблонный класс целых чисел, для использования его в шаблонном классе дробей. Звучит жутковасто. :D Так вот, в классе целых...

Ошибка при создании объекта класса - C++
Здравствуйте. В коде ниже при попытке вывести код на экран возникает следующая ошибка: prog.cpp: In function 'int main()': ...

Вызов метода родительского класса - C++
Всем доброго вечера! Читаю Р. Лафоре. Он пишет: Т.е. исходя из этого, можно предположить, что производный класс имеет...

Вызов конструктора базового класса из класса-наследника - C++
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a; public: A(int c):a(c){} ...


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

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

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