Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
5 / 5 / 3
Регистрация: 28.03.2010
Сообщений: 146
1

Конструкторы классов

08.04.2010, 20:16. Просмотров 2376. Ответов 15
Метки нет (Все метки)

Схематично:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{public:
A() {}//конструктор А
. . .   //методы класса А
}
 
class B: public A
{public:
B() {}//конструктор B
. . .   //методы класса B
}
На девятой строчке, в конструкторе класса В вылазит ошибка про класс А:
no appropriate default constructor available

Подскажите, пожалуйста, где ошибка?..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2010, 20:16
Ответы с готовыми решениями:

Конструкторы классов
Помогите разобраться с классами, не пойму как мне сделать правильно конструкторы класса...

Наследование классов и конструкторы
#include <stdio.h> #include <conio.h> class form { public: ...

Конструкторы классов в неявно подключенных DLL
Добрый день, господа программисты! Столкнулся с парой проблем при работе с DLL При написании...

Классы, конструкторы, деструкторы, методы классов
Доброго времени суток , Господа программисты. :) Очень нужна Ваша помощь. Написал программу, но...

15
Почетный модератор
7336 / 2601 / 270
Регистрация: 29.07.2006
Сообщений: 13,588
08.04.2010, 20:29 2
поставь точку с запятой после объявления класов A и B
0
5 / 5 / 3
Регистрация: 28.03.2010
Сообщений: 146
08.04.2010, 20:37  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{public:
A() {}//конструктор А
. . .   //методы класса А
};
 
class B: public A
{public:
B() {}//конструктор B
. . .   //методы класса B
}
извиняюсь за неточность. точка с запятой стоит... я как то неправильно использую конструкторы... вообще необходимо создать класс А с конструктором и класс В, потомок класса А без конструктора. Я пробовал:

C++
1
2
3
4
5
6
7
8
9
10
class A
{public:
A() {}//конструктор А
. . .   //методы класса А
};
 
class B: public A
{public:
. . .   //методы класса B
}
И при использовании он запрашивает в качестве аргумента (const B &), но я так и не смог понять чего он от меня хочет и дописал к В конструктор. В итоге имею другую ошибку(( ХЕЛП!!!
0
Почетный модератор
7336 / 2601 / 270
Регистрация: 29.07.2006
Сообщений: 13,588
08.04.2010, 20:40 4
не понимаю, в чем проблема. Вот класс с конструктором и без. Никаких ошибок быть не должно:
C++
1
2
3
4
5
6
7
8
9
class A
{
public:
A(){}
};
 
class B: public A
{
};
0
5 / 5 / 3
Регистрация: 28.03.2010
Сообщений: 146
08.04.2010, 20:40  [ТС] 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
35
36
37
38
39
40
41
42
43
44
45
Element::Element(short id)
{switch(id)
    {
    case 12:
        {
        Name="Магний";
        AN=12;
        AM=24.305;
        EO=1.31;
        TP=648.8;
        TK=1090;
        P=1.738;
        break;}
    case 35:
        {
        Name="Бром";
        AN=35;
        AM=79.904;
        EO=2.96;
        TP=-7.2;
        TK=58.78;
        P=3.119;
        break;}
    case 24:
        {
        Name="Хром";
        AN=24;
        AM=51.996;
        EO=1.66;
        TP=1857;
        TK=2672;
        P=7.19;
        }
    default:
        {
        Name="-";
        AN=0;
        AM=0;
        EO=0;
        TP=0;
        TK=0;
        P=0;
        }
    }
}
И, кстати, ошибки не в объявлении классов, а при вызове класса В.
0
Почетный модератор
7336 / 2601 / 270
Регистрация: 29.07.2006
Сообщений: 13,588
08.04.2010, 20:42 6
SphiNkSs, ты, блин, можешь сюда код с классами целиком дать, чтобы не писать код заранее ошибочный, потом добавлять что-то? Копируй сюда код и сообщение об ошибке.
0
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 354
08.04.2010, 20:42 7
У меня тоже спокойно компилятся оба варианта... Скиньте весь код на всякий случай
0
Эксперт С++
5019 / 2598 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
08.04.2010, 20:42 8
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
#include <iostream>
 
class A
{
    public:
            A() 
            {
            }
};
 
class B : public A
{
    public:
            void Hello() 
            { 
                std::cout << "Hello" << std::endl; 
            }
};
 
int main()
{
    B b;
    b.Hello();
}
Компиляция и результат работы программы:
Код
>mingw32-make
g++    -c -o \main.o \main.cpp
g++   \main.o  -o \app

>app

Hello
Ни одной ошибки и ни одного предупреждения
0
Ignat
08.04.2010, 20:44
  #9

Не по теме:


Я поражаюсь возникают такие примитивные вопросы, будто бы у людей литературы по C++ нет...

0
fasked
08.04.2010, 20:44
  #10

Не по теме:

Genius Ignat, бывает ступор иногда

0
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 354
08.04.2010, 20:46 11
Все ясно. Нужно в инициализации конструктора B писать конструктор A с необходимыми параметрами:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
    A(int a) {} //конструктор А
};
 
class B: public A
{
public:
    B(): A(5) {}//конструктор B, инициализируемый конструктором A
};
1
Почетный модератор
7336 / 2601 / 270
Регистрация: 29.07.2006
Сообщений: 13,588
08.04.2010, 20:47 12
SphiNkSs, в следующий раз пиши вопрос по-нормальному и давай все данные, а не обрывками и с ошибками.
0
5 / 5 / 3
Регистрация: 28.03.2010
Сообщений: 146
08.04.2010, 20:53  [ТС] 13
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <locale>
 
class Element
{
private:
char *Name;
int AN;
double AM,EO,TP,TK,P;
 
public:
Element::Element(short id)
{switch(id)
    {
    case 12:
        {
        Name="Магний";
        AN=12;
        AM=24.305;
        EO=1.31;
        TP=648.8;
        TK=1090;
        P=1.738;
        break;}
    case 35:
        {
        Name="Бром";
        AN=35;
        AM=79.904;
        EO=2.96;
        TP=-7.2;
        TK=58.78;
        P=3.119;
        break;}
    case 24:
        {
        Name="Хром";
        AN=24;
        AM=51.996;
        EO=1.66;
        TP=1857;
        TK=2672;
        P=7.19;
        }
    default:
        {
        Name="-";
        AN=0;
        AM=0;
        EO=0;
        TP=0;
        TK=0;
        P=0;
        }
    }
}
 
 
 
void Set(char *NameT, int ANT, double AMT, double EOT, double TmpPT, double TmpKT, double TPT, double PT)
    {
    Name=NameT;
    AN=ANT;
    AM=AMT;
    EO=EOT;
    TP=TmpPT;
    TK=TmpKT;
    P=PT;
    }
void Show()
    {
    printf("Элемент: %s\n",Name);
    printf("Атомный номер: %d\n",AN);
    printf("Атомная масса: %.2f а.е.м.\n",AM);
    printf("Электроотрицательность: %.2f\n",EO);
    printf("Температура плавления: %.1f C\n",TP);
    printf("Температура кипения: %.1f C\n",TK);
    printf("Плотность: %.2f г/(см^3)\n",P);
    }
};
 
class MIAE: public Element //MoreInfoAboutElement
{
public:
char *elem_type;
 
void SetType(char *elem_typeT)
    {
    elem_type=elem_typeT;
    }
 
void MoreShow()
    {
    printf("Тип элемента: %s\n",elem_type);
    Show();
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Russian");
Element E(24);
MIAE E1;//как аргумент требует (const MIAE &) и я не знаю что туда вписать, соответственно здесь же ошибка вылазит
E.Set("Wata",1,1.1,1.2,1.3,1.4,1.6,1.7);
E1.SetType("Металл");
E1.MoreShow();
E.Show();
getch();
return 0;
}
ошибка:
error C2512: 'MIAE' : no appropriate default constructor available

ЗЫ литература есть, там такой случай не рассматривается
0
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
08.04.2010, 21:01 14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MIAE: public Element //MoreInfoAboutElement
{
public:
MIAE(): Element(0){}         
char *elem_type;
 
void SetType(char *elem_typeT)
        {
        elem_type=elem_typeT;
        }
 
void MoreShow()
        {
        printf("Тип элемента: %s\n",elem_type);
        Show();
        }
};
Добавлено через 1 минуту
по хорошему в базовом классе надо прописать конструктор по умолчанию.
1
5 / 5 / 3
Регистрация: 28.03.2010
Сообщений: 146
08.04.2010, 21:02  [ТС] 15
Всем спс))) Проблема решена. Тему можно закрывать.
0
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
08.04.2010, 21:02 16
по хорошему в базовом классе надо прописать конструктор по умолчанию.
И тогда то что я добавил можно стереть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2010, 21:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Еще немного про конструкторы обобщенных классов
Пытаюсь проинициализировать объект обобщенного класса, параметром которого может выступать ссылка....

Как создавать конструкторы, что бы использовать переменные из любых классов?
В общем пишу программку, суть в том , что я должен научиться спокойно использовать переменные из...

Что такое конструкторы классов, копирования, по умолчанию с запретом неявного приведения аргументов?
Что такое конструкторы классов, конструкторы копирования, конструкторы по умолчанию и конструкторы...

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение,...


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

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

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