C++ помогите разобраться с наследованием
#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&)
Код:
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
Цитата:
void one::set(double in)
{
double iooo = in;
cout << iooo;
}
{
double iooo = in;
cout << iooo;
}
Ошибка. Создаётся локальная переменная iooo, которой и присваивается значение in. Значение поля класса не изменится.
Цитата:
two::two(int intwo)
{
int prr = intwo;
}
Та же самая ошибка, что и выше.
Кроме того, имеется явное несовпадение типов конструкторов базового и производного классов. Посему компилятор не может найти в базовом классе конструктор, аналогичный вызываемому.
Но можно явно указать вызываемый конструктор через список инициализации
Код:
two::two (int Value): one ((double) Value) //Вызов базового конструктора
{
}
{
}
Явно указываем, какой конструктор базового класса должен вызываться.
А тему создал в этом разделе так как не видел нигде кроме него C++, ну кроме визуальных.
Цитата:
тему создал в этом разделе так как не видел нигде кроме него C++, ну кроме визуальных.
Ну обычно в тех разделах C++ и обсуждают. Как бы компилятор он и в африке компилятор, а язык один. Хотя наверно по языкам, а не компиляторам разбиение форума логичней было бы )
Код:
one:ne(double inb){
Грубая синтаксическая ошибка. Не понятно, что значит одно двоеточие, и нет такого метода ne в классе, есть конструктор one[/QUOTE]
нет там синтаксической ошибки=)
просто форум заменил второе двоеточие и следующую буковку о на смайлик =)
Ну а далее да.. проблема с дефолтным конструктором.. точнее с его отсутствием.
просто форум заменил второе двоеточие и следующую буковку о на смайлик =)
[/quote]
форум заменил? или некоторым просто влом просмотреть опции которые предоставлены для оформления постов, в частности кода?
1 - надо использовать тэги [ code ] [ /code ]
2 - отключай смайлы, особенно полезно при написании кода на С++
зайди по ссылке редактировать сообщение, в рассширенный режим, и приведи свое сообщение в порядок пожалуйста.
:o :0 :o
просто форум заменил второе двоеточие и следующую буковку о на смайлик =)
Ну а далее да.. проблема с дефолтным конструктором.. точнее с его отсутствием.[/QUOTE]
Смайлик - факт :(
А проблема не в "конструкторе по умолчанию" - который создаётся автоматически для каждого класса, а в отсутствии конструктора типа int в базовом классе
Даже если бы в базовом классе был конструктор с параметром int, это не избавило бы от необходимости явного вызова его из конструктора дочернего класса, либо создания конструктора без параметров в базовом классе, который вызывался бы поумолчанию в дочерних.
1 - надо использовать тэги [ code ] [ /code ]
2 - отключай смайлы, особенно полезно при написании кода на С++
зайди по ссылке редактировать сообщение, в рассширенный режим, и приведи свое сообщение в порядок пожалуйста.
:o :0 :o[/QUOTE]
Ну извините=) код написан не мной и
Цитата:
влом просмотреть опции которые предоставлены для оформления постов
, тоже извините не про меня.
сорри за оффтоп.