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

Наследование, абстрактные классы. - C++

Восстановить пароль Регистрация
 
Alukar
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 6
24.10.2010, 17:33     Наследование, абстрактные классы. #1
Собственно нужно создать абстрактный базовый класс Shape, от него наследовать абстрактные классы Shape2D и Shape3D. От них конкретные классы для вычисления объёма и площади. Треугольник, прямоугольник круг в 2Д. Цилиндр, куб, сфера для 3Д.
пишу на вижуале 2008.

//Header1.h
Код
#include "stdafx.h"

class Shape   // базовый класс
{
public:
	virtual double getS()=0;
	virtual void Set()=0;
	virtual void print()=0;
};
class Shape2D: public Shape    // для 2Д фигур 
{

};
class rectangle: public Shape2D // прямоугольник
{
private:
	int a,b;
	double s;
public:
	rectangle(int=0,int=0);
	double getS();
	void Set(int,int);
	void print();
	~rectangle();
};
class circle: public Shape2D   // круг
{
private:
	int r;
	double s;
public:
	circle(int=0);
	double getS();
	void Set(int);
	void print();
	~circle();
};
class triangle: public Shape2D //треугольник
{ 
private:
	int a,b,c;
	double s;
public:
	triangle(int=0,int=0,int=0);
	double getS();
	void Set(int,int,int);
	void print();
	~triangle();
};
class Shape3D: public Shape  // для 3Д
{
public:
	//virtual void print()=0;
	virtual double getV()=0;
	//virtual double getS()=0;
	//virtual void Set()=0;
};
class cylinder: public Shape3D //цилиндр
{
private:
	int r,h;
	double s,v;
public:
	cylinder(int=0,int=0);
	double getV(); // получить объём
	double getS(); // получить прощадь
	void Set(int,int); // задать фигуру
	void print();
	~cylinder();
};
class cube: public Shape3D // куб
{
private:
	int a;
	double s,v;
public:
	cube(int=0);
	double getV(); // получить объём
	double getS(); // получить прощадь
	void Set(int);
	void print();
	~cube();
};
class sphere: public Shape3D // сфера
{
private:
	int r;
	double s,v;
public:
	sphere(int=0);
	double getV(); // получить объём
	double getS(); // получить прощадь
	void Set(int);
	void print();
	~sphere();
};
// source.cpp
Код
#include "stdafx.h"
#include "Header1.h"
#include <iostream>
#include "math.h"
using namespace std;

rectangle::rectangle(int va,int vb)
{
	a=va;
	b=vb;
	s=a*b;
}
double rectangle::getS()
{
	return s;
}
void rectangle::Set(int va,int vb)
{
	a=va;
	b=vb;
	s=a*b;
}
rectangle::~rectangle()
{
}
void rectangle::print()
{
	cout<<"a: "<<a<<endl<<"b: "<<b<<endl;
}

circle::circle(int vr)
{
	r=vr;
	s=3.14*r*r;
}
double circle::getS()
{
	return s;
}
void circle::Set(int vr)
{
	r=vr;
	s=3.14*r*r;
}
void circle::print()
{
	cout<<"R: "<<r<<endl;
}
circle::~circle()
{
}

triangle::triangle(int va, int vb, int vc)
{
	a=va;
	b=vb;
	c=vc;
	double p=(a+b+c)/2;
	s=sqrt(p*(p-a)*(p-b)*(p-c));
}
double triangle::getS()
{
	return s;
}
void triangle::print()
{
	cout<<"a: "<<a<<endl<<"b: "<<b<<endl<<"c: "<<c<<endl;
}
void triangle::Set(int va, int vb, int vc)
{
	a=va;
	b=vb;
	c=vc;
	double p=(a+b+c)/2;
	s=sqrt(p*(p-a)*(p-b)*(p-c));
}

triangle::~triangle()
{
}

cylinder::cylinder (int vr, int vh)
{
	r=vr;
	h=vh;
	s=2*(3.14*r*r)+6.28*r*h;
	v=3.14*r*r*h;
}

double cylinder::getS()
{
	return s;
}

double cylinder::getV()
{
	return v;
}

void cylinder::Set(int vr, int vh)
{
	r=vr;
	h=vh;
	s=2*(3.14*r*r)+6.28*r*h;
	v=3.14*r*r*h;
}

void cylinder::print()
{
	cout<<"r: "<<r<<endl<<"h: "<<h<<endl;
}

cube::cube (int va)
{
	a=va;
	s=6*a*a;
	v=a*a*a;
}

void cube::Set(int va)
{
	a=va;
	s=6*a*a;
	v=a*a*a;
}

double cube::getS()
{
	return s;
}

double cube::getV()
{
	return v;
}

void cube::print()
{
	cout<<"a: "<<a<<endl;
}

sphere::sphere (int vr)
{
	r=vr;
	s=4*3.14*r*r;
	v=(4*3.14*r*r*r)/3;
}

void sphere::Set(int vr)
{
	r=vr;
	s=4*3.14*r*r;
	v=(4*3.14*r*r*r)/3;
}

double sphere::getS()
{
	return s;
}

double sphere::getV()
{
	return v;
}

void sphere::print()
{
	cout<<"r: "<<r<<endl;
}
выдаёт кучу ошибок, по идее не правильно наследую что-то, пишет что перераспределяю классы...

Добавлено через 15 минут
Ну и main пустой пока что.

Код
#include "stdafx.h"
#include "Header1.h"
#include "source.cpp"
#include <iostream>
#include "math.h"

using namespace std;

void main()
{
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2010, 17:33     Наследование, абстрактные классы.
Посмотрите здесь:

Абстрактные классы, наследование C++
C++ наследование и абстрактные классы!!
C++ Абстрактные классы
C++ Абстрактные классы
C++ Абстрактные классы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.10.2010, 17:39     Наследование, абстрактные классы. #2
Alukar, Гм. Круг у вас абстрактный остается. Да и остальные похоже. Потому как вы создаете новые функции, а не переопределяете абстрактные наследка.
C++
1
        virtual void Set()=0;
в Shape

C++
1
        void Set(int,int);
в Rectangle
C++
1
        void Set(int);
в Circle
C++
1
        void Set(int,int,int);
в Triangle
C++
1
        void Set(int,int); // задать фигуру
в Cilindre

И так далее. Итог: все классы у вас абстрактные.
Alukar
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 6
24.10.2010, 18:22  [ТС]     Наследование, абстрактные классы. #3
C++
1
2
3
4
5
6
void cube::Set(int va)
{
        a=va;
        s=6*a*a;
        v=a*a*a;
}
Я же вот тут наново описываю функцию. Чтобы сделать класс конкретным. Почему это считается как создание новой функции? Мне пишет что я перераспределяю class Shape, Shape2D и остальные
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.10.2010, 18:25     Наследование, абстрактные классы. #4
Alukar, Господи. Потому что в базовом классе Shape функция Set не имеет ни одного параметра, как вы сами я думаю заметили. А в остальных местах - имеет. Вот и результат.
Хотя если main пустой... Возможно стоит поставить страж включения. Но то, что классы абстрактные - 100%
Alukar
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 6
24.10.2010, 20:24  [ТС]     Наследование, абстрактные классы. #5
Разобрался, спасибо.
Yandex
Объявления
24.10.2010, 20:24     Наследование, абстрактные классы.
Ответ Создать тему
Опции темы

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