Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/106: Рейтинг темы: голосов - 106, средняя оценка - 4.64
19 / 19 / 22
Регистрация: 25.08.2010
Сообщений: 90
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Столкнулся с такой проблемой: если есть родительский класс с конструктором, то при создании дочернего объекта от этого класса не получается вызвать этот конструктор родительского класса. Может запутанно описал проблему, попытался накидать небольшой пример, может из него понятнее будет:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2013, 11:00
Ответы с готовыми решениями:

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

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

Вызов базового конструктора с параметрами из дочернего класса
Всем привет. Есть базовый класс, у которого есть конструктор с параметром. Создал дочерний класс...

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён?
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую...

16
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
08.01.2013, 11:09 2
Объявить конструктор класса A без параметров.
0
19 / 19 / 22
Регистрация: 25.08.2010
Сообщений: 90
08.01.2013, 11:12  [ТС] 3
Schizorb, другого решения быть не может?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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
25 / 25 / 11
Регистрация: 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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
08.01.2013, 13:10 7
Цитата Сообщение от Schizorb Посмотреть сообщение
Объявить конструктор класса A без параметров.
Плохо. Что за объект в этом случает получается?
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
08.01.2013, 13:15 8
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Что за объект в этом случает получается?
В смысле? Чем плох объект созданный конструктором без параметров?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
08.01.2013, 13:30 9
Цитата Сообщение от Schizorb Посмотреть сообщение
В смысле? Чем плох объект созданный конструктором без параметров?
Тем, что процессом конструирования нельзя управлять с помощью параметров?
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
08.01.2013, 13:38 10
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Тем, что процессом конструирования нельзя управлять с помощью параметров?
Так это само собой. Но я, допустим, вижу в коде у автора
C++
1
B b;
Без всяких параметров создается объект. Значит и конструктору базового класса, по логике, не нужны параметры. А если и нужны, то их отсюда не передать. Тогда соглашусь с Evg, можно создать конструктор для B, который вызовет конструктор А с каким-нибудь параметром.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
08.01.2013, 22:05 11
Цитата Сообщение от Schizorb Посмотреть сообщение
В смысле? Чем плох объект созданный конструктором без параметров?
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.01.2013, 10:03 12
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
Берём класс, описывающий строку (или список). Очевидно, что конструктор по умолчанию создаёт пустую строку (или пустой список). А потому не надо проблему треугольника проецировать на всё программирование в целом
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
09.01.2013, 10:11 13
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Берем класс описывающий треугольник. Какой треугольник должен создаваться?
по умолчанию пустой треугольник, а к такому классу добавить методы инициализации его параметров,чем плохо, возможно на этапе инициализации нам известны не все параметры треугольника,а у нас например имеется метод который сделает ресайз треугольника чтоб вписать его в окружность, мы инициализируем пустой и вызываем метод ресайза, как пример
1
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
09.01.2013, 10:17 14
Цитата Сообщение от Evg Посмотреть сообщение
Берём класс, описывающий строку (или список). Очевидно, что конструктор по умолчанию создаёт пустую строку (или пустой список). А потому не надо проблему треугольника проецировать на всё программирование в целом
Пустая строка/список это одно из естественных состояний.
Это не проблема треугольника, а проблема создания объекта. Берем класс описывающий человека, если кто-то предполагает наличия конструктора без параметров, то кто будет создан?

Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
по умолчанию пустой треугольник, а к такому классу добавить методы инициализации его параметров,чем плохо,
Тем, что пустых треугольников не существует. А потом еще надо не забыть присвоить ему корректное значение.
0
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
09.01.2013, 10:32 15
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
А потом еще надо не забыть присвоить ему корректное значение.
это ответственность разработчика, и "пустой треугольник" будет в данном случае некая нематериальная абстракция, которую нужно материализовать,например чтоб класс добавить в vector, то у него должен быть конструктор по умолчанию, он может быть параметрическим, но какие вы туда параметры будете отдавать? не справедливо отдавать предпочтение какому либо треугольнику, поэтому лучше делать его "пустым" а иммено привести к точке задав все параметры 0, либо делать без параметров
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
09.01.2013, 10:33 16
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Берем класс описывающий треугольник.
Конкретно для треугольника может вообще и не нужен конструктор без параметров, или если нужно - пусть в нем задаются какие-то значения по умолчанию или нулевые, мало ли какая задача.

В данной задаче уже есть конструктор без параметров для класса B, какой объект при этом должен создаваться и чем будут инициализироваться его элементы, это уж как автор решит, что именно ему нужно. Спор, по-моему, ни о чем.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.01.2013, 15:13 17
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Пустая строка/список это одно из естественных состояний.
Это не проблема треугольника, а проблема создания объекта. Берем класс описывающий человека, если кто-то предполагает наличия конструктора без параметров, то кто будет создан?
Потому я и говорю, что не надо один конкретный случай проецировать на всё программирование. Для одной абстракции конструтор без параметров логического смысла не имеет, для другой абстракции - имеет. Конкретно по поводу данной темы - ТС вообще только учит Си++ и разбирается, как он работает. А потому замечание, что "конкструктор без параметров не имеет смысла" вообще не в тему
0
09.01.2013, 15:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2013, 15:13
Помогаю со студенческими работами здесь

ООП: вызов переменной из родительского класса
Доброго всем времени суток. Есть такой скрипт: &lt;?php class myParent { protected $err; private...

Как при создании дочернего окна передать ему указатель на static-переменную в оконной процедуре родительского?
Есть оконная процедура родительского окна, в ней есть static-переменная, например, static...

Инициализация конструктора и конструктора родительского класса
Есть два класса: class C1 { public $a; public $b; public $c; function...

Вызов родительского конструктора
class test { public static void main(String args) { class2 ob = new class2(2, 3, 4);...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru