Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2011, 19:33   #1
dasvex
Пользователь
 
Регистрация: 08.08.2011
Сообщений: 39
По умолчанию Ругаеться на чисто виртуальную функцию

сообщает о ошибке в чисто виртуальной функции virtual long GetPerim()=0;
с соседней функцией virtual long GetArea()=0; все в порядке .
при изменении GetPerium в не чисто виртуальную virtual long GetPerium(){return 0};, ошибка исчезает.
никак не могу разобрать что с ней не так , ведь в принципе на аналогичную функцию GetArea() компилятор не ругается.
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Shape 
{	
       public:
		Shape(){};
		virtual ~Shape(){};
		virtual long GetArea()=0;
		virtual long GetPerim()=0;
		virtual void Draw()=0;
};
void Shape::Draw()
{
cout<<"Abstract fun\n";
}
//********************************************************
class Circle :public Shape
{
	public:
		Circle(int);
		virtual ~Circle();
		virtual long GetArea();
		virtual long GetPerium();
		virtual void Draw();
	private:
		int itsRadius;
		int itsCircunference;
};

Circle::Circle(int radius):itsRadius(radius)
{}

Circle::~Circle()
{}

long Circle::GetArea()
{
	return 3*itsRadius*itsRadius;
}

long Circle::GetPerium()
{
	return 9*itsRadius;
}

void Circle::Draw()
{
	cout<<"circle draw \n\n";
	Shape::Draw();
}
//********************************************************
class Rectangle :public Shape
{
	public:
		Rectangle(int,int);
		virtual ~Rectangle();
		virtual long GetArea();
		virtual long GetPerium();
		virtual int GetLenght();
		virtual int GetWight();
		virtual void Draw();
	private:
		int itsWight;
		int itsLenght;
};

Rectangle::Rectangle(int lenght,int wight):itsLenght(lenght),itsWight(wight)
{}

Rectangle::~Rectangle()
{}

long Rectangle::GetArea()
{
	return itsLenght*itsWight;
}
long Rectangle::GetPerium()
{
	return 2*itsLenght+2*itsWight;
}

int Rectangle::GetWight()
{
	return itsWight;
}

int Rectangle::GetLenght()
{
	return itsLenght;
}

void Rectangle::Draw()
{
	for(short i =0;i<itsLenght; i++)
	{
		for(short j=0;j<itsWight;j++)	cout<<"x";
		cout<<"\n";
	}
	Shape::Draw();
}
//********************************************************
class Square :public Rectangle 
{
	public:
		Square(int);
		Square(int , int );
		virtual ~Square();
		virtual long GetPerium();
};

Square::Square(int len ):Rectangle (len,len )
{}

Square::Square(int len, int wight):Rectangle(len,wight)
{
	if(GetLenght()!=GetWight()) cout<<"Err this not square!!!!!";
}

Square::~Square()
{}

long Square::GetPerium()
{
	return 4*GetLenght();
}
//********************************************************
int _tmain(int argc, _TCHAR* argv[])
{
	int chose;
	bool fQuit = false;
	Shape *  sp;
	while (1)
	{
		cout<<"(1)Circle (2)Rect (3)Sq (0)exit";
		cin>>chose;
		switch(chose)
		{
			case 1 :sp = new Circle (5);
			break;

			case 2 :sp = new Rectangle (4,6);
			break;

			case 3 :sp = new Square (5);
			break;

			default : fQuit = true;
			break;
		}
		if(fQuit) break;

		sp->Draw();
		delete sp;
		cout<<"\n";
	}
	return 0 ;
}
сообшение компилятора :

Код:
1>------ Build started: Project: nasledovanie13, Configuration: Debug Win32 ------
1>Compiling...
1>nasledovanie13.cpp
1>e:\my achievement\summer11\nasledovanie13\nasledovanie13\nasledovanie13\nasledovanie13.cpp(147) : error C2259: 'Circle' : cannot instantiate abstract class
1>        due to following members:
1>        'long Shape::GetPerim(void)' : is abstract
1>        e:\my achievement\summer11\nasledovanie13\nasledovanie13\nasledovanie13\nasledovanie13.cpp(13) : see declaration of 'Shape::GetPerim'
1>e:\my achievement\summer11\nasledovanie13\nasledovanie13\nasledovanie13\nasledovanie13.cpp(150) : error C2259: 'Rectangle' : cannot instantiate abstract class
1>        due to following members:
1>        'long Shape::GetPerim(void)' : is abstract
1>        e:\my achievement\summer11\nasledovanie13\nasledovanie13\nasledovanie13\nasledovanie13.cpp(13) : see declaration of 'Shape::GetPerim'
1>e:\my achievement\summer11\nasledovanie13\nasledovanie13\nasledovanie13\nasledovanie13.cpp(153) : error C2259: 'Square' : cannot instantiate abstract class
1>        due to following members:
1>        'long Shape::GetPerim(void)' : is abstract
1>        e:\my achievement\summer11\nasledovanie13\nasledovanie13\nasledovanie13\nasledovanie13.cpp(13) : see declaration of 'Shape::GetPerim'
1>Build log was saved at "file://e:\my achievement\summer11\nasledovanie13\nasledovanie13\nasledovanie13\Debug\BuildLog.htm"
1>nasledovanie13 - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
dasvex вне форума Ответить с цитированием
Старый 19.08.2011, 19:44   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам компилятор прямо пишет что нельзя создавать объекты с абстрактными методами.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.08.2011, 19:44   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Код:
class Shape 
{	
       public:
		Shape(){};
		virtual ~Shape(){};
		virtual long GetArea()=0;
		virtual long GetPerim()=0;
		virtual void Draw()=0;
};
void Shape::Draw()
{
cout<<"Abstract fun\n";
}
Это чё за безобразие? Вы сначала объявили функцию Draw чисто виртуальной, а затем сразу же определяете её же в этом же абстрактном базовом классе? С вами всё в порядке?
_-Re@l-_ вне форума Ответить с цитированием
Старый 19.08.2011, 19:55   #4
dasvex
Пользователь
 
Регистрация: 08.08.2011
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вам компилятор прямо пишет что нельзя создавать объекты с абстрактными методами.
эммм ...да пишет .
но почему он не ругается тогда на virtual long GetArea()=0;?
чем принципиально отличается GetArea() и GetPerium() 0_o?

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Код:
class Shape 
{	
       public:
		Shape(){};
		virtual ~Shape(){};
		virtual long GetArea()=0;
		virtual long GetPerim()=0;
		virtual void Draw()=0;
};
void Shape::Draw()
{
cout<<"Abstract fun\n";
}
Это чё за безобразие? Вы сначала объявили функцию Draw чисто виртуальной, а затем сразу же определяете её же в этом же абстрактном базовом классе? С вами всё в порядке?


да , со мной все в порядке . Аа, простите , кто сказал что так нельзя ? есть что то противозаконное ?

Последний раз редактировалось Stilet; 19.08.2011 в 20:12.
dasvex вне форума Ответить с цитированием
Старый 19.08.2011, 20:02   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Тогда ставлю вопрос по-другому. На кой чёрт было определять функцию, если она чисто виртуальная(ведь можно было и в объявлении определить!)? Ну или зачем было определять её чисто вирутальной, если вы её определили? Это называется, вам делать нечего.

Код:
#include "stdafx.h"
Ах, вы ещё и VS пользуете...
_-Re@l-_ вне форума Ответить с цитированием
Старый 19.08.2011, 20:04   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)вы не внимательны, у вас в абстрактном классе GetPerim, а в круге уже какая то GetPerium.
Цитата:
Аа, простите , кто сказал что так нельзя ? есть что то противозаконное ?
абстактная функция в принципе не имеет реализации.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.08.2011, 20:08   #7
dasvex
Пользователь
 
Регистрация: 08.08.2011
Сообщений: 39
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Тогда ставлю вопрос по-другому. На кой чёрт было определять функцию, если она чисто виртуальная(ведь можно было и в объявлении определить!)? Ну или зачем было определять её чисто вирутальной, если вы её определили? Это называется, вам делать нечего.

Код:
#include "stdafx.h"
Ах, вы ещё и VS пользуете...
ну оттого что я ее определил она не перестала быть чисто виртуальной .
в нее можно добавить некий функционал к примеру )

ну да вижуал .. есть какие то против ? почему нет ?
dasvex вне форума Ответить с цитированием
Старый 19.08.2011, 20:09   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
в нее можно добавить некий функционал к примеру )
а толку от нее?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.08.2011, 20:12   #9
dasvex
Пользователь
 
Регистрация: 08.08.2011
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
1)вы не внимательны, у вас в абстрактном классе GetPerim, а в круге уже какая то GetPerium.
абстактная функция в принципе не имеет реализации.
спасибо ) не понимаю как это вышло )
первым делом я и перепроверил на себя на опечатки в этой функции )
видимо плохо перепроверил
простите за невнимательность

почему не имеет реализации? она прекрасно вызывается Shape::Draw()

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а толку от нее?
в данном коде никакого .было сделано ради эксперимента .
ну а в принципе почему бы в другой программе не помещать в нее скажем код создания окна ?

Последний раз редактировалось Stilet; 20.08.2011 в 08:11.
dasvex вне форума Ответить с цитированием
Старый 19.08.2011, 20:20   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
ну а в принципе почему бы в другой программе не помещать в нее скажем код создания окна ?
и вы думаете он будет вызван автоматически?(это вам не конструктор)
только если ручками максимум.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На getasynckeystate() ругаеться Касперский? Дима я Win Api 9 19.08.2012 13:44
Функция на виртуальную распечатку строки Alex Cones Общие вопросы Delphi 5 15.05.2010 15:33
Ругаеться антивирусник Volkogriz Общие вопросы Delphi 4 20.01.2010 23:06
помогите с кодом а то компилятор ругаеться =( Above_men Помощь студентам 9 21.04.2009 07:21
маска ввода через виртуальную клавиатуру Димка JavaScript, Ajax 3 09.03.2009 19:33