Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Въпрос за наследственост при класове?

Featured Replies

Аммм значи помагам на приятел за курсов проект по програмиране и направих почти всичко в задачата. Остана само наследственост при класовете и n-мерно пространство. Та въпросите ми са:

1. Как се прави (или ми кажете какво е) наследственост при класове и

2. Какво е n-мерно пространство (такова с n оси или?) и как се изобразява точка в него? Ако разбера какво е това пространство ще изобразя точката в него, но незнам какво се има в предвид?

Тъй като обикновено пространството е 2 или 3-мерно, точка се изобразява с три координати при 3 мерното и 2 при 2-мерното пространство, е добре при n-мерното с n на брой координати ли трябва да се изобрази точката?

Ще бъда благодарен ако някой ми разясни тези неща! :rolleyes:

Аммм значи помагам на приятел за курсов проект по програмиране и направих почти всичко в задачата. Остана само наследственост при класовете и n-мерно пространство. Та въпросите ми са:

1. Как се прави (или ми кажете какво е) наследственост при класове и

2. Какво е n-мерно пространство (такова с n оси или?) и как се изобразява точка в него? Ако разбера какво е това пространство ще изобразя точката в него, но незнам какво се има в предвид?

Тъй като обикновено пространството е 2 или 3-мерно, точка се изобразява с три координати при 3 мерното и 2 при 2-мерното пространство, е добре при n-мерното с n на брой координати ли трябва да се изобрази точката?

Ще бъда благодарен ако някой ми разясни тези неща! :P

Наследяването е една от най-важните особености на обектно-ориентираното програмиране. Казано съвсем накратко наследяването се свежда до следното – един клас се създава като наследник на друг клас. Тези два класа се именуват обикновено като родителски клас и дъщерен клас. Създадения дъщерен клас автоматически получава всички особености на своя родителски клас. Освен това което се наследява от родителския клас, в дъщерния може да се добавят нови методи, характеристики и променливи, които не са съществували в родителския клас.

По въпроса за пространството според се има предвид дефинирането и работата с n-мерни масиви, а не самото изобразяване на точка.

  • Автор
По въпроса за пространството според се има предвид дефинирането и работата с n-мерни масиви, а не самото изобразяване на точка.

Благодаря за отговора, а би ли ми дал пример за наследство при класовете? Така не ми е ясно какво точно трябва да направя.

А за пространството, задачата е: "Да се създадат 4 базови класа точка в n-мерното пространство". Та затова не го разбирам - може би трябва да се направи така, че потребителят да въвежда размерността на пространството и точката да се описва с толкова координати колкото е размерно пространството. Много объркано е зададено и не мога да си го обясня! Някакви предложения за n-мерно пространство?

Аммм значи помагам на приятел за курсов проект по програмиране и направих почти всичко в задачата. Остана само наследственост при класовете и n-мерно пространство. Та въпросите ми са:

1. Как се прави (или ми кажете какво е) наследственост при класове и

2. Какво е n-мерно пространство (такова с n оси или?) и как се изобразява точка в него? Ако разбера какво е това пространство ще изобразя точката в него, но незнам какво се има в предвид?

Тъй като обикновено пространството е 2 или 3-мерно, точка се изобразява с три координати при 3 мерното и 2 при 2-мерното пространство, е добре при n-мерното с n на брой координати ли трябва да се изобрази точката?

Ще бъда благодарен ако някой ми разясни тези неща! :P

1) Ами когато обявиш един клас за наследник на друг, наследяваш характеристиките на базовия клас. В общи линии правиш "частен случай" на базовия. Например може да направиш класове Жаба и Прилеп, който наследяват класа Животно. Може да използваш обект от класа наследник там (и по същия начин), където може да използваш и базовия клас. Но предефинираш методите от базовия, както и да добавяш нови неща. Не ми е много формално описанието, но в общи линии това е идеята. Как точно се реализира зависи от конкретния език за програмиране.

2) За n-мерното пространство - да, точките там се изобразяват с n координати. Представлява множеството от всички такива n-координатни точки.

Ами наследяването служи за да се пренасят основни белези от класа родител към класа наследник. Един вид дървовидно описание на сходни обекти от произволно естество. Класът родител притежава само основните белези, а всеки наследник притежава описанието на конкретните за него характеристики. Всичко това вдига абстракцията на разработвания модел, но пести код и способства за функционалното и семантино обособяване на програмните модули. Хубаво е да се спомене и за абстрактните класове - по идея те са предназначени само за указване на интерфейс. От тях има смисъл само при описанието на нови класове. При изграждането на наследствения модел се използват много други хватки като имплементация на абстрактни и витуални методи, овърлоад на метод, ограничаване видимоста на характеристиките и методите на обектите, но това е много-много дълга тема. Пък и всеки език има характерни особености при описанието на обектната структура на модела. Хубаво е да специфицираш език. За да видим, кой може да ти помогне.

  • Автор
1) Ами когато обявиш един клас за наследник на друг, наследяваш характеристиките на базовия клас. В общи линии правиш "частен случай" на базовия. Например може да направиш класове Жаба и Прилеп, който наследяват класа Животно. Може да използваш обект от класа наследник там (и по същия начин), където може да използваш и базовия клас. Но предефинираш методите от базовия, както и да добавяш нови неща. Не ми е много формално описанието, но в общи линии това е идеята. Как точно се реализира зависи от конкретния език за програмиране.

2) За n-мерното пространство - да, точките там се изобразяват с n координати. Представлява множеството от всички такива n-координатни точки.

Благодаря на всички за отговорите! Това за n-мерното пространство ще ми свърши работа да го направя в задачата. А ще ми дадете ли пример за наследяване на класове? Разбрах що е наследственост, но ще ми трябва пример?

"Да се създадат 4 базови класа точка в n-мерното пространство"

И аз не го разбирам това... angry.gif Буквално преведено означава да направиш 4 реализации на класове описващи точка в n-мерното пространство. В най-елементарния вариант пишеш една реализация, а в останалите сменяш името на класа (примерно добавящ пореден номер към името).

В такива случаи се пита човека, който е задал условието (или някои друг специално упълномощен да поеме тази функция), какво е искал да каже.

  • Автор
И аз не го разбирам това... angry.gif Буквално преведено означава да направиш 4 реализации на класове описващи точка в n-мерното пространство. В най-елементарния вариант пишеш една реализация, а в останалите сменяш името на класа (примерно добавящ пореден номер към името).

В такива случаи се пита човека, който е задал условието (или някои друг специално упълномощен да поеме тази функция), какво е искал да каже.

Хах даа ... много е объркано. На мен ми трябваше да го прочета поне 30-40 пъти, за да се опитам да разбера какво е искал да каже човекът. Е аз съм направил един базов клас Точка и 4 обекта от този клас - точките A, B, C и D, като съм задал да се описват с координати X и Y. Е ще променя само това, че ще се описват с n на брой координати, зададени от потребителя. А като съм създал тези 4 обекта от клас точка всъщност не съм ли направил наследяване или се бъркам. Та ще помоля за пример за наследяване, ако това не, за да мога да завърша задачата. :wors:

Хах даа ... много е объркано. На мен ми трябваше да го прочета поне 30-40 пъти, за да се опитам да разбера какво е искал да каже човекът. Е аз съм направил един базов клас Точка и 4 обекта от този клас - точките A, B, C и D, като съм задал да се описват с координати X и Y. Е ще променя само това, че ще се описват с n на брой координати, зададени от потребителя. А като съм създал тези 4 обекта от клас точка всъщност не съм ли направил наследяване или се бъркам. Та ще помоля за пример за наследяване, ако това не, за да мога да завърша задачата. :wors:

Не - не си направил наследяване с 4-те обекта. Ето ти малък пример на Java:

public class Shape

{

	protected int _x;

	protected int _y;


	public int getX()

	{

		return _x;

	}


	public int getY()

	{

		return _y;

	}


	public void draw()

	{

		System.out.println( "This is a shape" );

	}

}


public class Circle extends Shape

{

	protected int _diameter;


	public Circle( int diameter )

	{

		this._diameter = diameter;

	}


	public int getDiameter()

	{

		return _diameter;

	}


	public void draw()

	{

		System.out.println( 

				"This is a circle on (" + _x + "," + _y  + ") with diam " + _diameter );

	}

}

Тук класът Circle наследява Shape.

В твоя случай може би може да наследиш класа за n-мерно пространство и да направиш да кажем 2-мерно или 3-мерно, в които да добавиш някои специфични методи (например за изчертаване на екрана; пресмятане на обем на 3-мерни фигури и лице на двумерни...).

Редактирано от divak (преглед на промените)

Благодаря на всички за отговорите! Това за n-мерното пространство ще ми свърши работа да го направя в задачата. А ще ми дадете ли пример за наследяване на класове? Разбрах що е наследственост, но ще ми трябва пример?

Ето ти на C# :

using System;


namespace Point

{

	public abstract class NDPoint

	{

		protected int[] coordinates;


		protected NDPoint()

		{

			Init();

		}


		public void Print()

		{

			for (int i = 0; i < coordinates.Length; i++)

			{

				Console.Out.WriteLine("c[{0}] = {1};", i, coordinates[i]);

			}

		}


		protected abstract void Init();

	}


	public class OneDPoint : NDPoint

	{

		public OneDPoint() : base()

		{

		}


		public int X

		{

			get

			{

				return coordinates[0];

			}

			set

			{

				coordinates[0] = value;

			}

		}


		protected override void Init()

		{

			coordinates = new int[1];

		}

	}


	public class TwoDPoint : OneDPoint

	{

		public TwoDPoint() : base()

		{

		}


		public int Y

		{

			get

			{

				return coordinates[1];

			}

			set

			{

				coordinates[1] = value;

			}

		}


		protected override void Init()

		{

			coordinates = new int[2];

		}

	}


	public class ThreeDPoint : TwoDPoint

	{

		public ThreeDPoint() : base()

		{

		}


		public int Z

		{

			get

			{

				return coordinates[2];

			}

			set

			{

				coordinates[2] = value;

			}

		}


		protected override void Init()

		{

			coordinates = new int[3];

		}

	}

}

Редактирано от darkterminal (преглед на промените)

  • Автор
Не - не си направил наследяване с 4-те обекта. Ето ти малък пример на Java:

public class Shape

{

	protected int _x;

	protected int _y;


	public int getX()

	{

		return _x;

	}


	public int getY()

	{

		return _y;

	}


	public void draw()

	{

		System.out.println( "This is a shape" );

	}

}


public class Circle extends Shape

{

	protected int _diameter;


	public Circle( int diameter )

	{

		this._diameter = diameter;

	}


	public int getDiameter()

	{

		return _diameter;

	}


	public void draw()

	{

		System.out.println( 

				"This is a circle on (" + _x + "," + _y  + ") with diam " + _diameter );

	}

}
Тук класът Circle наследява Shape. В твоя случай може би може да наследиш класа за n-мерно пространство и да направиш да кажем 2-мерно или 3-мерно, в които да добавиш някои специфични методи (например за изчертаване на екрана; пресмятане на обем на 3-мерни фигури и лице на двумерни...).
Ето ти на C# :
using System;


namespace Point

{

	public abstract class NDPoint

	{

		protected int[] coordinates;


		protected NDPoint()

		{

			Init();

		}


		public void Print()

		{

			for (int i = 0; i < coordinates.Length; i++)

			{

				Console.Out.WriteLine("c[{0}] = {1};", i, coordinates[i]);

			}

		}


		protected abstract void Init();

	}


	public class OneDPoint : NDPoint

	{

		public OneDPoint() : base()

		{

		}


		public int X

		{

			get

			{

				return coordinates[0];

			}

			set

			{

				coordinates[0] = value;

			}

		}


		protected override void Init()

		{

			coordinates = new int[1];

		}

	}


	public class TwoDPoint : OneDPoint

	{

		public TwoDPoint() : base()

		{

		}


		public int Y

		{

			get

			{

				return coordinates[1];

			}

			set

			{

				coordinates[1] = value;

			}

		}


		protected override void Init()

		{

			coordinates = new int[2];

		}

	}


	public class ThreeDPoint : TwoDPoint

	{

		public ThreeDPoint() : base()

		{

		}


		public int Z

		{

			get

			{

				return coordinates[2];

			}

			set

			{

				coordinates[2] = value;

			}

		}


		protected override void Init()

		{

			coordinates = new int[3];

		}

	}

}

Благодаря ви, тези две неща ще ми свършат работа. Утре ще се поизпотя над това и ако имам въпроси ще питам пак. Благодаря ви още веднъж! :wors:

  • Автор

Здравейте, пак съм аз. Някой би ли ми казъл къде ми е грешката в този код, защото не мога да я намеря. Значи горната задача е: Да се създадат 4 базови класа точка в n-мерното пространство и 1 производен клас n-мерна сфера зададена с център и разиус. Не успях да направя чласа сфера да е наследствен на класа точка. Ако някой го направи ще съм му благодарен!

Та ето го кодът:

Файл point.h

class point

{

		private:

		int c[];


		public:

		point(char ch, int);

		~point();

		void print(int);

};
Файл sfera.h
class sfera

{

		private:

		int c[],r;


		public:

		sfera(char ch, int);

		~sfera();

		void print(int n);

		int getr();

};
Файл KR.cpp
#include <iostream.h>

#include "point.h"

#include "sfera.h"

#define pi 3.1415926535


//-----------

float area(sfera R);

void main()

{int n; float Sq;

cout<<"Vuvedete razmernost na prostranstvoto n = ";

cin>>n;


point A('A', n), B('B', n), C('C', n), D('D', n);

sfera R('R',n);


cout<<"\nZa tochka A vuvedohte:"<<endl;

A.print(n);


cout<<"\nZa tochka B vuvedohte:"<<endl;

B.print(n);


cout<<"\nZa tochka C vuvedohte:"<<endl;

C.print(n);


cout<<"\nZa tochka D vuvedohte:"<<endl;

D.print(n);


cout<<"\nZa sferata R vuvedohte:"<<endl;

R.print(n);


Sq=area(R);

cout<<"\nS na sferata R = "<<Sq<<endl;


cin.get();

cin.get();

}

//----------------------


point::point(char ch, int n)

{cout<<"\nZa tochka "<<ch<<" vuvedete:";

		for(int i=1; i<n+1; i++)

		{

		cout<<"\n\tKoordinata nomer "<<i<<" = ";

		cin>>c[i];

		}

}


sfera::sfera(char ch, int n)

{	   cout<<"\nConstructor\n";

		cout<<"\nZa sferata "<<ch<<" vuvedete:";

		for(int i=1; i<n+1; i++)

		{

		cout<<"\n\tKoordinata za centura nomer "<<i<<" = ";

		cin>>c[i];

		}

		cout<<"\n\tRadius r = ";

		cin>>r;

}


void point::print(int n)

{for(int i=1; i<n+1; i++)

		{	cout<<"\tKoordinata nomer "<<i<<" = "<<c[i]<<endl;

		}

}

void sfera::print(int n)

{for(int i=1; i<n+1; i++)

		{	cout<<"\tKoordinata nomer "<<i<<" = "<<c[i]<<endl;

		}

		cout<<"\tRadius r = "<<r<<endl;

}


sfera::getr()

{

	return r;

}


point::~point()

{ cout<<"\nDestructor\n";

}

//---------------


sfera::~sfera()

{ cout<<"\nDestructor\n";

}

//---------------


float area(sfera R)

{int r, r1;

float S;

	r=R.getr();

	r1=r*r;

	S=4*pi*r1;

	return S;

}

//---------

Ще съм благодарен, ако някой помогне! ;)

При изпълнение на програмата се получават невярни данни, тоест координатите от точките се бъркат!

  • Автор
class sfera : public point

{

...

}

ОК, това за наследственост, а защо програмата не функционира правилно и ми вади невярни данни, къде ми е грешката?

  • Администратор

А ако работиш само с точки верни данни ли ти дава :nono:

Може би трябва да добавиш едно virtual пред декларацията на print :nono:

  • Автор
А ако работиш само с точки верни данни ли ти дава :nono:

Може би трябва да добавиш едно virtual пред декларацията на print :nono:

И при една тачка и една сфера, или при повече от една точка без сфера се получава разминаване:

Vuvedete razmernost na prostranstvoto n = 3


Za tochka A vuvedete:

		Koordinata nomer 1 = 11


		Koordinata nomer 2 = 12


		Koordinata nomer 3 = 13


Za sferata R vuvedete:

		Koordinata za centura nomer 1 = 21


		Koordinata za centura nomer 2 = 22


		Koordinata za centura nomer 3 = 23


		Radius r = 3


Za tochka A vuvedohte:

		Koordinata nomer 1 = 23

		Koordinata nomer 2 = 12

		Koordinata nomer 3 = 13


Za sferata R vuvedohte:

		Koordinata nomer 1 = 21

		Koordinata nomer 2 = 22

		Koordinata nomer 3 = 23

		Radius r = 3


Destructor


S na sferata R = 113.097

Сложих виртуал пред принт! Някакви идеи? Къде ми е грешката, разминават се стойности за координатите!

  • Администратор

Сега погледнах кода по-подробно

Не си указал размер на масива c !!!

Броенето в масива започва от 0!

Сега пускам Visual Studio-то и ще тествам :P

Така работи за тримерно (n=3) пространство, а за да се указва с параметър масива трябва да се направи динамичен

Компилирано с VS 2005, има някои изменения ( iostream вместо iostream.h, using namespace std; за да отговаря на стандарта)

main.cpp

#include <iostream>

#include "point.h"

#include "Sphere.h"

#define pi 3.1415926535


using namespace std;


//-----------

float area(sfera R);

void main()

{int n; float Sq;

cout<<"Vuvedete razmernost na prostranstvoto n = ";

cin>>n;


point A('A', n), B('B', n), C('C', n), D('D', n);

sfera R('R',n);


cout<<"\nZa tochka A vuvedohte:"<<endl;

A.print(n);


cout<<"\nZa tochka B vuvedohte:"<<endl;

B.print(n);


cout<<"\nZa tochka C vuvedohte:"<<endl;

C.print(n);


cout<<"\nZa tochka D vuvedohte:"<<endl;

D.print(n);


cout<<"\nZa sferata R vuvedohte:"<<endl;

R.print(n);


Sq=area(R);

cout<<"\nS na sferata R = "<<Sq<<endl;


cin.get();

cin.get();

}

//----------------------












float area(sfera R)

{int r, r1;

float S;

	r=R.getr();

	r1=r*r;

	S=4*pi*r1;

	return S;

}

//---------
point.cpp
#include "point.h"

#include <iostream>

using namespace std;


point::~point()

{ cout<<"\nDestructor\n";

}


void point::print(int n)

{for(int i=0; i<n; ++i)

		{	cout<<"\tKoordinata nomer "<<i<<" = "<<c[i]<<endl;

		}

}


point::point(char ch, int n)

{cout<<"\nZa tochka "<<ch<<" vuvedete:";

		for(int i=0; i<n; ++i)

		{

		cout<<"\n\tKoordinata nomer "<<i<<" = ";

		cin>>c[i];

		}

}
point.h
#ifndef __point_h__

#define __point_h__


class point

{

		private:

		int c[3];


		public:

		point(char ch, int);

		~point();

		void print(int);

};


#endif
Sphere.cpp
#include "Sphere.h"

#include <iostream>

using namespace std;


sfera::~sfera()

{ cout<<"\nDestructor\n";

}


int sfera::getr()

{

	return r;

}


void sfera::print(int n)

{for(int i=0; i<n; ++i)

		{	cout<<"\tKoordinata nomer "<<i<<" = "<<c[i]<<endl;

		}

		cout<<"\tRadius r = "<<r<<endl;

}


sfera::sfera(char ch, int n)

{	   cout<<"\nConstructor\n";

		cout<<"\nZa sferata "<<ch<<" vuvedete:";

		for(int i=1; i<n; ++i)

		{

		cout<<"\n\tKoordinata za centura nomer "<<i<<" = ";

		cin>>c[i];

		}

		cout<<"\n\tRadius r = ";

		cin>>r;

}
Sphere.h
#ifndef __sfera_h__

#define __sfera_h__


class sfera

{

		private:

		int c[3],r;


		public:

		sfera(char ch, int);

		~sfera();

		void print(int n);

		int getr();

};


#endif

  • Автор
Сега погледнах кода по-подробно

Не си указал размер на масива c !!!

Броенето в масива започва от 0!

Сега пускам Visual Studio-то и ще тествам :super:

......................................

Лелеее, много съм заблеян. Вярно, че не съм оказал размерност на масива! Когато му дадох размерност програмата тръгна и си вади правилните данни! Даже размерността на пространството се задава от потребителя! :P

Ето пускам кода за Borland C++ Builder (Конзолна програма):

Файл point.h:

class point

{

		private:

		int c[100];


		public:

		point(char ch, int);

		~point();

		void print(int)const;

};
Файл sfera.h:
class sfera

{

		private:

		int c[100],r;


		public:

		sfera(char ch, int);

		~sfera();

		void print(int n)const;

		int getr();

};
Файл KR.cpp:
#include <iostream.h>

#include "point.h"

#include "sfera.h"

#define pi 3.1415926535


//-----------

float area(sfera R);

void main()

{int n;

float Sq;

cout<<"Vuvedete razmernost na prostranstvoto n = ";

cin>>n;


point A('A', n), B('B', n), C('C', n), D('D', n);

sfera R('R',n);


cout<<"\nZa tochka A vuvedohte:"<<endl;

A.print(n);


cout<<"\nZa tochka B vuvedohte:"<<endl;

B.print(n);


cout<<"\nZa tochka C vuvedohte:"<<endl;

C.print(n);


cout<<"\nZa tochka D vuvedohte:"<<endl;

D.print(n);


cout<<"\nZa sferata R vuvedohte:"<<endl;

R.print(n);


Sq=area(R);

cout<<"\nS na sferata R = "<<Sq<<endl;


cin.get();

cin.get();

}

//----------------------


point::point(char ch, int n)

{cout<<"\nZa tochka "<<ch<<" vuvedete:";

		for(int i=0; i<n; i++)

		{

		cout<<"\n\tKoordinata nomer "<<i+1<<" = ";

		cin>>c[i];

		}

}


sfera::sfera(char ch, int n)

{		cout<<"\nZa sferata "<<ch<<" vuvedete:";

		for(int i=0; i<n; i++)

		{

		cout<<"\n\tKoordinata za centura nomer "<<i+1<<" = ";

		cin>>c[i];

		}

		cout<<"\n\tRadius r = ";

		cin>>r;

}


void point::print(int n)const

{for(int i=0; i<n; i++)

		{	cout<<"\tKoordinata nomer "<<i+1<<" = "<<c[i]<<endl;

		}

}

point::~point()

{

}

sfera::~sfera()

{

}


void sfera::print(int n)const

{for(int i=0; i<n; i++)

		{	cout<<"\tKoordinata nomer "<<i+1<<" = "<<c[i]<<endl;

		}

		cout<<"\tRadius r = "<<r<<endl;

}


sfera::getr()

{

	return r;

}



float area(sfera R)

{int r, r1;

float S;

	r=R.getr();

	r1=r*r;

	S=4*pi*r1;

	return S;

}

//---------

Обаче сега ако ми кажеш от този код как да направя класа сфера наследствен от класа точка? :wors:

  • Администратор

Аз тъкмо ти написах версия с динамичен масив

В общи линии заменяш int c[100] с int* c, в конструктора - c = new int[n], в деструктора - delete[] c, а във area() предаваш указател ( за да не се занимаваш с copy constructor)

А иначе трябва на сфера да добавиш : public point ( class sphere : public point { ) обаче тогава сигурно при компилация ще ти каже че не може да намери подходящ конструктор за point ( на мен така ми разправя VS 2005 )

  • Автор
Аз тъкмо ти написах версия с динамичен масив

В общи линии заменяш int c[100] с int* c, в конструктора - c = new int[n], в деструктора - delete[] c, а във area() предаваш указател ( за да не се занимаваш с copy constructor)

А иначе трябва на сфера да добавиш : public point ( class sphere : public point { ) обаче тогава сигурно при компилация ще ти каже че не може да намери подходящ конструктор за point ( на мен така ми разправя VS 2005 )

НАПРАВИХ ГО :rolleyes:Много съм радостен и благодаря на всички за помощта!

Да така е казва, че не може да намери подходяк конструктор, защото при наследяване винаги търси конструктор със точното име на класа, без променливи, тоест в случая добавих конструктор

point::point()

{

}
а в декларацията в класа точка:
point();
Абе пускам целия код, за да ме разбереш: Файл point.h:
class point

{

		private:

		int c[100];


		public:

		point();

		point(char ch, int);

		~point();

		void print(int)const;

};
Файл sfera.h:
class sfera : public point

{

		private:

		int c[100],r;


		public:

		sfera(char ch, int);

		~sfera();

		void print(int n)const;

		int getr();

};
Файл KR.cpp:
#include <iostream.h>

#include "point.h"

#include "sfera.h"

#define pi 3.1415926535


//-----------

float area(sfera R);

void main()

{int n;

float Sq;

cout<<"Vuvedete razmernost na prostranstvoto n = ";

cin>>n;


point A('A', n), B('B', n), C('C', n), D('D', n);

sfera R('R',n);


cout<<"\nZa tochka A vuvedohte:"<<endl;

A.print(n);


cout<<"\nZa tochka B vuvedohte:"<<endl;

B.print(n);


cout<<"\nZa tochka C vuvedohte:"<<endl;

C.print(n);


cout<<"\nZa tochka D vuvedohte:"<<endl;

D.print(n);


cout<<"\nZa sferata R vuvedohte:"<<endl;

R.print(n);


Sq=area(R);

cout<<"\nS na sferata R = "<<Sq<<endl;


cin.get();

cin.get();

}

//----------------------


point::point(char ch, int n)

{cout<<"\nZa tochka "<<ch<<" vuvedete:";

		for(int i=0; i<n; i++)

		{

		cout<<"\n\tKoordinata nomer "<<i+1<<" = ";

		cin>>c[i];

		}

}


point::point()

{

}


sfera::sfera(char ch, int n)

{		cout<<"\nZa sferata "<<ch<<" vuvedete:";

		for(int i=0; i<n; i++)

		{

		cout<<"\n\tKoordinata za centura nomer "<<i+1<<" = ";

		cin>>c[i];

		}

		cout<<"\n\tRadius r = ";

		cin>>r;

}


void point::print(int n)const

{for(int i=0; i<n; i++)

		{	cout<<"\tKoordinata nomer "<<i+1<<" = "<<c[i]<<endl;

		}

}

point::~point()

{

}

sfera::~sfera()

{

}


void sfera::print(int n)const

{for(int i=0; i<n; i++)

		{	cout<<"\tKoordinata nomer "<<i+1<<" = "<<c[i]<<endl;

		}

		cout<<"\tRadius r = "<<r<<endl;

}


sfera::getr()

{

	return r;

}



float area(sfera R)

{int r, r1;

float S;

	r=R.getr();

	r1=r*r;

	S=4*pi*r1;

	return S;

}

//---------

Успех и благодаря на всички, които ми помогнаха! :wors:

Добре би било също така да преместиш масива int c[100] на базовия клас в "protected" секцията му и да не го декларираш повторно в производния клас.

Освен това, не е зле да инициализираш някои променливи с 0, преди да ги използваш. Например във функцията area(...) имаш три декларирани, но неинициализирани променливи: r, r1 и S.

Ако ще ползваш динамичен масив, също би било добре да обходиш всичките му елементи и да ги инициализираш с 0.

Редактирано от Daemon (преглед на промените)

  • Автор
Добре би било също така да преместиш масива int c[100] на базовия клас в "protected" секцията му и да не го декларираш повторно в производния клас.

Освен това, не е зле да инициализираш някои променливи с 0, преди да ги използваш. Например във функцията array(...) имаш три декларирани, но неинициализирани променливи: r, r1 и S.

Ако ще ползваш динамичен масив, също би било добре да обходиш всичките му елементи и да ги инициализираш с 0.

Послушах съветът ти и направих корекциите, благодаря! :rolleyes:

Да така е казва, че не може да намери подходяк конструктор, защото при наследяване винаги търси конструктор със точното име на класа, без променливи, тоест в случая добавих конструктор

Не е задължително, ако в базовия клас нямаш подразбиращ се конструктор (т.е. такъв без параметри), тогава в класа наследник се прави нещо такова:

class Base

{

public:

	Base( int n ) { /* to be implemented */ }

};


class Derived1

{

public:

	Derived1( int n ): Base ( n ) { /* to be implemented */ }

};
А относно това с int[100] и после с динамичните масиви... По-лесно ще е да ползваш някои от стандартните класове - например vector (или list, deque и каквито там бяха различните колекции). Дръга забележка - като предаваш аргументи от някой клас по-добре предавай само референция към обекта (или указател), ако не го променяш е добре да е const. Например:
вместо 

  void print( Sphera s ) { ... }

по-добре 

  void print( const Sphera& s ) { ... }

Иначе се копират всички член-променливи в аргумента... и стават бози, ако се ползва динамично заделени масиви, без подходящ copy конструктор и operator= (както всъщност е в твоя случай - а може би не,... още ли си с int[100]) /т.е. това си е бъг/. Най-добре ползвай vector (или си напиши copy конструктор и operator=, но това изисква повече писане).

Редактирано от divak (преглед на промените)

  • Автор
Не е задължително, ако в базовия клас нямаш подразбиращ се конструктор (т.е. такъв без параметри), тогава в класа наследник се прави нещо такова:

Задължително е, иначе дава грешка при компилирането на програмата! Не иска да компилира кода, като казва, че не може да намери подразбиращ се конструктор за класа! Пробвах така както ти казваш, но не стана, даде ми грешката.

А относно това с int[100] и после с динамичните масиви... По-лесно ще е да ползваш някои от стандартните класове - например vector (или list, deque и каквито там бяха различните колекции).

Дръга забележка - като предаваш аргументи от някой клас по-добре предавай само референция към обекта (или указател), ако не го променяш е добре да е const. Например:

Иначе се копират всички член-променливи в аргумента... и стават бози, ако се ползва динамично заделени масиви, без подходящ copy конструктор и operator= (както всъщност е в твоя случай - а може би не,... още ли си с int[100]) /т.е. това си е бъг/. Най-добре ползвай vector (или си напиши copy конструктор и operator=, но това изисква повече писане).

const съм използвал при функцията за изкарване на данните на обектите print(); За другите не е необходимо да се поставя този оператор. В случая задачата не е да се направи най-добрата и сложна програма, а работеща курсова задача, затова използвам масивът c[100] и след това динамични масиви. В случая не е подходящо да се използват неща като vector! Когато масивът е зададен с размерност не се получават "бози" при предаването на аргументи, тъй като за всеки обект си се заделя от паметта място за масива му! Когато обаче не е зададена размерност на масива и се използват динамични такитва, тогава се получава четене на елементи от масива на другия обект и тогава се получават "бози". Затова съм задал размерност на масива и съм инициализирал елементите му с нули! А и задачата е за ниво начинаещ и не трябва да се пишат повече неща от необходимото. Но все пак ти благодаря за отзивите.

А ако на някой му потрябва подобно нещо ето пускам оптимизирания код за Borland C++ Builder 4.0:

Файл point.h:

class point

{

		protected:

		int c[100];


		public:

		point();

		point(char ch, int);

		~point();

		void print(int)const;

};
Файл sfera.h:
class sfera : public point

{

		private:

		int r;


		public:

		sfera(char ch, int);

		sfera(int r=0);

		~sfera();

		void print(int n)const;

		int getr();

};
Файл KR.cpp:
#include <iostream.h>

#include "point.h"

#include "sfera.h"

#define pi 3.1415926535


//-----------

float area(sfera R);

void main()

{int n=0;

float Sq=0;

cout<<"Vuvedete razmernost na prostranstvoto n = ";

cin>>n;


point A('A', n), B('B', n), C('C', n), D('D', n);

sfera R('R',n);


cout<<"\nZa tochka A vuvedohte:"<<endl;

A.print(n);


cout<<"\nZa tochka B vuvedohte:"<<endl;

B.print(n);


cout<<"\nZa tochka C vuvedohte:"<<endl;

C.print(n);


cout<<"\nZa tochka D vuvedohte:"<<endl;

D.print(n);


cout<<"\nZa sferata R vuvedohte:"<<endl;

R.print(n);


Sq=area(R);

cout<<"\nS na sferata R = "<<Sq<<endl;


cin.get();

cin.get();

}

//----------------------


point::point(char ch, int n)

{cout<<"\nZa tochka "<<ch<<" vuvedete:";

		for(int i=0; i<n; i++)

		{

		cout<<"\n\tKoordinata nomer "<<i+1<<" = ";

		cin>>c[i];

		}

}


point::point()

{for(int i=0; i<100; i++)

		{

				c[i]=0;

		}

}


sfera::sfera(char ch, int n)

{		cout<<"\nZa sferata "<<ch<<" vuvedete:";

		for(int i=0; i<n; i++)

		{

		cout<<"\n\tKoordinata za centura nomer "<<i+1<<" = ";

		cin>>c[i];

		}

		cout<<"\n\tRadius r = ";

		cin>>r;

}


void point::print(int n)const

{for(int i=0; i<n; i++)

		{	cout<<"\tKoordinata nomer "<<i+1<<" = "<<c[i]<<endl;

		}

}

point::~point()

{

}

sfera::~sfera()

{

}


void sfera::print(int n)const

{for(int i=0; i<n; i++)

		{	cout<<"\tKoordinata nomer "<<i+1<<" = "<<c[i]<<endl;

		}

		cout<<"\tRadius r = "<<r<<endl;

}


sfera::getr()

{

	return r;

}



float area(sfera R)

{int r=0, r1=0;

float S=0;

	r=R.getr();

	r1=r*r;

	S=4*pi*r1;

	return S;

}

//---------

Накратко обяснението:

Дефинирани са 2 класа - точка и сфера. Класа точка е базов, а класа сфера е производен! Създават се в n-мерно пространство, което се въвежда от потребителя 4 обекта от клас точка и се задават координатите им според размерността на пространството и 1 обект от клас сфера и се задават координатите на центъра на сферата според размерността на пространството и радиусът на сферата! След това въведените данни се показват на екрана. Като допълнение се изчислява лицето на сферата и се показва на екрана. След проверка на данните се натиска ентър и се излиза от програмата!

Благодаря на всички още веднъж!

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Публикацията ви съдържа термини, които не допускаме! Моля, редактирайте съдържанието си и премахнете подчертаните думи по-долу. Ако замените букви от думата със звездички или друго, за да заобиколите това предупреждение, профилът ви ще бъде блокиран и наказан!
Напишете отговор в тази тема...

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    26%
    Дарени 256.00 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.