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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
3AKPbIBAKA
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 5
#1

Наследование в С++ - C++

24.11.2010, 20:22. Просмотров 1549. Ответов 13
Метки нет (Все метки)

Здравствуйте!


Код
#include <iostream>
using namespace std;
class exp{
	public:
		virtual exp* diff()=0;
		virtual void print()=0;
};
class numb:public exp{
		int val;
public:	numb(int a){val=a;}
		exp* diff(){
			exp* A=new numb(0);
			return A;
		}
		void print(){cout<<val;}
};

class var:public exp{
		char x;
public:	var(char c){x=c;}
		exp* diff(){
			exp* A=new numb(1);
			return A;
		}
		void print(){cout<<x;}
};
class add:public exp{
		exp* val1;exp* val2;
public:	add(exp* a,exp* b){val1=a;val2=b;}
		exp* diff(){
			exp* A=new add (val1->diff(),val2->diff());
			return A;
		}
		void print(){
			cout<<"(";
			val1->print();
			cout<<")+(";
			val2->print();
			cout<<")";
		}
};

class sub:public exp{
	exp* val1;exp* val2;
public:	sub(exp* a,exp* b){val1=a;val2=b;}
		exp* diff(){
			exp* A=new sub (val1->diff(),val2->diff());
			return A;
		}
		void print(){
			cout<<"(";
			val1->print();
			cout<<")-(";
			val2->print();
			cout<<")";
		}
};

class mul:public exp{
	exp* val1;exp* val2;
public:	mul(exp* a,exp* b){val1=a;val2=b;}
		exp* diff(){
			exp* A=new add (&mul(val1->diff(),val2),&mul(val2->diff(),val1));
			return A;
		}
		void print(){
			cout<<"(";
			val1->print();	
			cout<<")*(";
			val2->print();
			cout<<")";
		}
};

class divo:public exp{
exp* val1;exp* val2;
public:	divo(exp* a,exp* b){val1=a;val2=b;}
		exp* diff(){
			exp* A=new divo( &divo( &sub((val1->diff(),val2),&mul(val2->diff(),val1) ), val2 ) , val2);
			return A;
		}
		void print(){
			cout<<"(";
			val1->print();	
			cout<<")/(";
			val2->print();
			cout<<")";
		}
};
class sinus;
class cosus:public exp{
exp* val;
public:	cosus(exp* a){val=a;}
		exp* diff(){
			exp* A=new mul(&sinus( val),val->diff());
			return A;
		}
		void print(){
			cout<<"cos(";
			val->print();
			cout<<")";
		}
};
class sinus:public exp{
exp* val;
public:	sinus(exp* a){val=a;}
		exp* diff(){
			exp* A=new mul(&cosus( val),val->diff());
			return A;
		}
		void print(){
			cout<<"sin(";
			val->print();
			cout<<")";
		}
};
class tg:public exp{
	exp* val;
public:	tg(exp* a){val=a;}
		exp* diff(){
			exp* A=new mul(&divo(&sinus(val),&cosus( val)),val->diff());
			return A;
		}
		void print(){
			cout<<"tg(";
			val->print();
			cout<<")";
		}
};

void main(){
exp *e = new add(new numb(1), new var('x'));
std::cout << "\n";
exp *de = e->diff();
de->print();
cout << "\n";
int o;
cin>>o;
delete e;
delete de;
}
Выдает ошибку


Код
Error	1	error C2440: '<function-style-cast>' : cannot convert from 'exp *' to 'sinus'
Подскажите, пожалуйста, в чем дело.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2010, 20:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование в С++ (C++):

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование - C++
char* Texts :: SetBit() { char a; int b; cout &lt;&lt; &quot;Получаем битовую строку&quot; &lt;&lt; endl; cin &gt;&gt; a; b = strlen(a);...

наследование - C++
Пытаюсь разобраться в наследовании Есть класс class File { public: struct comp { char num; // Имя переменной char st;...

Наследование - C++
Всем привет. Может кто нибудь подсказать с чего начать при создании класса для работы с файлами на подобии ostream( а точнее как правильно...

наследование - C++
определить базовый класс ''точка''. Затем от него определить два произвольных класса ''прямоугольник'' и ''параллелепипед'', в каждом из...

Наследование?! - C++
привет всем. Есть класс Circle c1, c2, c3 Нужно реализовать через наследование класс множество, прошу помочь как он будет выглядеть...

13
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
24.11.2010, 20:25 #2
передаете объект не по указателю, а по значению
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
24.11.2010, 20:29 #3
В какой строке ошибка?

Добавлено через 1 минуту
Цитата Сообщение от gooseim Посмотреть сообщение
передаете объект не по указателю, а по значению
Да не, там с типами проблема.
1
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
24.11.2010, 20:49 #4
В какой строке ошибка?
1
3AKPbIBAKA
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 5
24.11.2010, 21:38  [ТС] #5
В 96-ой
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
24.11.2010, 21:55 #6
3AKPbIBAKA, скорее всего ошибка в том, что компилятор в этой строчке не видит конструктор класса sinus, т.к. класс еще не определен. Придется код класса cosus писать в cpp. Он может видеть только указатель на этот класс, т.к. класс уже объявлен (class sinus; ).
Кроме того, у вас sinus вызывает cosus, а cosus вызывает sinus. Боюсь, произойдет зацикливание.
Еще, чтобы передать временные параметры, такие как &sinus(x) нужно использовать модификатор const. В этом случае они будут константные. Если не хотите их делать константными, используйте вместо & - new. Иначе возможен крах программы.
1
3AKPbIBAKA
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 5
24.11.2010, 22:10  [ТС] #7
3AKPbIBAKA, скорее всего ошибка в том, что компилятор в этой строчке не видит конструктор класса sinus, т.к. класс еще не определен. Придется код класса cosus писать в cpp.
Спасибо за ответ. Не могли бы вы конкретней пояснить, как реализовать?
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
24.11.2010, 22:13 #8
3AKPbIBAKA, для начала переделайте программу, чтобы только cosus вызывал sinus или только sinus вызывал cosus. И больше ничего не надо будет делать. Просто расположить классы в нужном порядке.
Вообще как бы в h-файлах пишут объявление, а определение - в cpp.
1
3AKPbIBAKA
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 5
24.11.2010, 22:31  [ТС] #9
А сделать так, чтобы синус вызывал косинус, а косинус - синус, и это работало, нельзя? А то это ведь дифференцирование...

Добавлено через 15 минут
Задание, если кому интересно, такое
http://www.cyberforum.ru/cpp-beginne...read65209.html
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
24.11.2010, 22:33 #10
Если cosus не вызывает sinus::diff и sinus не вызывает cosus::diff, то можно чтобы они друг друга вызывали. Иначе нельзя. Просто мне че то в вашем коде лень разбираться.
В общем, если все как я сказал, то можно так:
h-файл:
C++
1
2
3
4
5
6
7
class sinus;
class cosus:public exp{
exp* val;
public: cosus(exp* a);
                exp* diff();
                void print();
};
cpp-файл:
C++
1
2
3
4
5
6
7
8
9
10
cosus::cosus(exp* a){val=a;}
exp* cosus::diff(){
exp* A=new mul(&sinus( val),val->diff());
     return A;
}
void cosus::print(){
      cout<<"cos(";
      val->print();
      cout<<")";
}
Кстати про временные объекты я полную чушь написал.
&sinus(x) вообще нельзя писать.
И если делаете new, то делайте и delete.
Чтобы избавиться от delete, используйте "умные" указатели. В вашем случае подойдет auto_ptr<>.
1
3AKPbIBAKA
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 5
24.11.2010, 22:49  [ТС] #11
Спасибо, общая картина ясна.
Цитата Сообщение от gooseim Посмотреть сообщение
&sinus(x) вообще нельзя писать.
А эта ^ штука все равно работала
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
24.11.2010, 23:02 #12
Цитата Сообщение от 3AKPbIBAKA Посмотреть сообщение
Спасибо, общая картина ясна.
А эта ^ штука все равно работала
Значит у вас этот объект использовался только до выхода за область видимости.
& нельзя использовать, если происходит с ним работа после того, как он освобождается в вызывающем блоке.
Мне очень лениво сегодня разбирать чужие коды, поэтому возможно в вашем случае можно так оставить. Хотя все равно это не очень хороший стиль программирования.
Еще советую почитать про "умные" указатели (auto_ptr, shared_ptr и проч.) Потому что у вас после завершения программы происходит утечка памяти, из-за того, что не всегда вызываете delete после new. Если будете использовать "умные" указатели, то про delete можно будет забыть.
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
25.11.2010, 08:24 #13
Цитата Сообщение от 3AKPbIBAKA Посмотреть сообщение
В 96-ой
Строка 96:
C++
1
exp* A=new mul(&sinus( val),val->diff());
ошибка:
cannot convert from 'exp *' to 'sinus'
Ошибки можно читать, они очень информативны)
Вы указателю на exp пытаетесь присвоить непонятно, что (компилятор пришел к выводу, что адрес типа sinus) Либо исправте это, либо напишите оператор приведения типов.
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
25.11.2010, 14:38 #14
Цитата Сообщение от 3AKPbIBAKA Посмотреть сообщение
А эта ^ штука все равно работала
Самые коварные ошибки в программах это как раз те, при наличии которых всё работает именно так, как должно(до поры до времени конечно). Вообще, компилятор должен был выдать предупреждения по этому поводу, как и про отсутствие виртуального деструктора кстати говоря...
0
25.11.2010, 14:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2010, 14:38
Привет! Вот еще темы с ответами:

наследование - C++
Как наследовать классы с использованием виртуальных функций? Можете привести пример?

наследование в С++ - C++
Добрый вечер. относительно недавно мною была получена задача, а точнее несколько задач в одной...И как это ни печально звучит, проблемы...

наследование - C++
помогите пожалуйсто дописать класс многоугольников , и рисовать на монитор с помощью mfc , заранее благодарен... class figure{ public: ...

Наследование в C++ - C++
Прошу помощи, ибо С++ не моё, а лабораторные работы девушке сдавать надо: Создать 1 базовый класс и несколько производных. Все...


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

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

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