Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++ помогите разобраться с наследованием

6.8K
05 октября 2006 года
byff
38 / / 01.07.2006
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class one
{
public:
one(double inb);
void set(double in);
double showw();
protected:
int iooo;
};

void one::set(double in)
{


double iooo = in;
cout << iooo;
}

one::one(double inb)
{
set(inb);
}

double one::showw()
{
return(iooo);
}

class two : public one
{
public:
two(int intwo);
void show();
protected:
int prr;

};
two::two(int intwo)
{
int prr = intwo;
}
int main()
{
...
return 0;
}

Почему при попытке что-либо сделать с классом two включающим one компилятор начинает писать кучу ошибок вроде
.cpp: In constructor ‘two::two(int)’:
3.cpp:42: error: no matching function for call to ‘one::one()’
3.cpp:23: note: candidates are: one::one(double)
3.cpp:6: note: one::one(const one&)
240
05 октября 2006 года
aks
2.5K / / 14.07.2006
Во первых, что значит эта строчка:
 
Код:
one:ne(double inb){

Грубая синтаксическая ошибка. Не понятно, что значит одно двоеточие, и нет такого метода ne в классе, есть конструктор one

Исправь это на
 
Код:
one::one(double inb)

и почти все ошибки пропадут, кроме одной.

Во вторых, в классе one нету дефолтного конструктора по умолчанию, есть только конструктор one(double inb), и при создании объектов этого класса можно использовать только этот конструктор.
Класс two наследуется от one. По умолчанию в классе two вызывается дефолтный конструктор класса one. Но так как явно описанно, что дефолтного конструктора нет, а есть конструктор с double, надо в конструкторе two вызвать конструктор класса one с double. Или же описать всетаки дефолтный конструктор.
Тоесть меняешь код так:
 
Код:
two::two(int intwo) : one(0){
...
}

И все работает.

Ну и наконец не понятно как тема относится программированию в Unix конкретно. Код всеже написан с применением только стандартных элементов c++ и никак не привязан к ОС.
Хотя да немного странное разделение форума не дает четкого представления куда писать вопросы по голому C/C++
И еще пользуйся при оформлении кода тегом форума code
309
05 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:
void one::set(double in)
{
double iooo = in;
cout << iooo;
}


Ошибка. Создаётся локальная переменная iooo, которой и присваивается значение in. Значение поля класса не изменится.

Цитата:

two::two(int intwo)
{
int prr = intwo;
}


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

 
Код:
two::two (int Value): one ((double) Value) //Вызов базового конструктора
{
}

Явно указываем, какой конструктор базового класса должен вызываться.
6.8K
05 октября 2006 года
byff
38 / / 01.07.2006
Огромное спасибо!
А тему создал в этом разделе так как не видел нигде кроме него C++, ну кроме визуальных.
240
05 октября 2006 года
aks
2.5K / / 14.07.2006
Цитата:

тему создал в этом разделе так как не видел нигде кроме него C++, ну кроме визуальных.


Ну обычно в тех разделах C++ и обсуждают. Как бы компилятор он и в африке компилятор, а язык один. Хотя наверно по языкам, а не компиляторам разбиение форума логичней было бы )

10K
06 октября 2006 года
Kalastiuz
21 / / 14.07.2005
[QUOTE=aks]Во первых, что значит эта строчка:
 
Код:
one:ne(double inb){

Грубая синтаксическая ошибка. Не понятно, что значит одно двоеточие, и нет такого метода ne в классе, есть конструктор one[/QUOTE]

нет там синтаксической ошибки=)
просто форум заменил второе двоеточие и следующую буковку о на смайлик =)

Ну а далее да.. проблема с дефолтным конструктором.. точнее с его отсутствием.
242
06 октября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=Kalastiuz]нет там синтаксической ошибки=)
просто форум заменил второе двоеточие и следующую буковку о на смайлик =)
[/quote]
форум заменил? или некоторым просто влом просмотреть опции которые предоставлены для оформления постов, в частности кода?
1 - надо использовать тэги [ code ] [ /code ]
2 - отключай смайлы, особенно полезно при написании кода на С++
зайди по ссылке редактировать сообщение, в рассширенный режим, и приведи свое сообщение в порядок пожалуйста.

:o :0 :o
309
07 октября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Kalastiuz]нет там синтаксической ошибки=)
просто форум заменил второе двоеточие и следующую буковку о на смайлик =)

Ну а далее да.. проблема с дефолтным конструктором.. точнее с его отсутствием.[/QUOTE]

Смайлик - факт :(

А проблема не в "конструкторе по умолчанию" - который создаётся автоматически для каждого класса, а в отсутствии конструктора типа int в базовом классе
3
07 октября 2006 года
Green
4.8K / / 20.01.2000
Конструктор поумолчанию создается автоматически лишь в том случае, если не объявлены др. конструкторы.
Даже если бы в базовом классе был конструктор с параметром int, это не избавило бы от необходимости явного вызова его из конструктора дочернего класса, либо создания конструктора без параметров в базовом классе, который вызывался бы поумолчанию в дочерних.
10K
07 октября 2006 года
Kalastiuz
21 / / 14.07.2005
[QUOTE=OlgaKr]форум заменил? или некоторым просто влом просмотреть опции которые предоставлены для оформления постов, в частности кода?
1 - надо использовать тэги [ code ] [ /code ]
2 - отключай смайлы, особенно полезно при написании кода на С++
зайди по ссылке редактировать сообщение, в рассширенный режим, и приведи свое сообщение в порядок пожалуйста.

:o :0 :o[/QUOTE]
Ну извините=) код написан не мной и
Цитата:
влом просмотреть опции которые предоставлены для оформления постов

, тоже извините не про меня.

сорри за оффтоп.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог