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

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

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


Код
#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'
Подскажите, пожалуйста, в чем дело.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2010, 20:22     Наследование в С++
Посмотрите здесь:

C++ Наследование
Наследование C++
C++ наследование
C++ Наследование?!
C++ наследование
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
24.11.2010, 20:25     Наследование в С++ #2
передаете объект не по указателю, а по значению
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
24.11.2010, 20:29     Наследование в С++ #3
В какой строке ошибка?

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

Добавлено через 15 минут
Задание, если кому интересно, такое
http://www.cyberforum.ru/cpp-beginne...read65209.html
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
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<>.
3AKPbIBAKA
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 5
24.11.2010, 22:49  [ТС]     Наследование в С++ #11
Спасибо, общая картина ясна.
Цитата Сообщение от gooseim Посмотреть сообщение
&sinus(x) вообще нельзя писать.
А эта ^ штука все равно работала
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
24.11.2010, 23:02     Наследование в С++ #12
Цитата Сообщение от 3AKPbIBAKA Посмотреть сообщение
Спасибо, общая картина ясна.
А эта ^ штука все равно работала
Значит у вас этот объект использовался только до выхода за область видимости.
& нельзя использовать, если происходит с ним работа после того, как он освобождается в вызывающем блоке.
Мне очень лениво сегодня разбирать чужие коды, поэтому возможно в вашем случае можно так оставить. Хотя все равно это не очень хороший стиль программирования.
Еще советую почитать про "умные" указатели (auto_ptr, shared_ptr и проч.) Потому что у вас после завершения программы происходит утечка памяти, из-за того, что не всегда вызываете delete после new. Если будете использовать "умные" указатели, то про delete можно будет забыть.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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) Либо исправте это, либо напишите оператор приведения типов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2010, 14:38     Наследование в С++
Еще ссылки по теме:

C++ Заменить наследование классов на наследование интерфейсов
наследование C++
Наследование наследование ) C++

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
25.11.2010, 14:38     Наследование в С++ #14
Цитата Сообщение от 3AKPbIBAKA Посмотреть сообщение
А эта ^ штука все равно работала
Самые коварные ошибки в программах это как раз те, при наличии которых всё работает именно так, как должно(до поры до времени конечно). Вообще, компилятор должен был выдать предупреждения по этому поводу, как и про отсутствие виртуального деструктора кстати говоря...
Yandex
Объявления
25.11.2010, 14:38     Наследование в С++
Ответ Создать тему
Опции темы

Текущее время: 00:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru