الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعريف كلاس قبل كلاس

مغلقمُجاب
بدأه المـقـدام في 7 أبريل 2014 · 2 رد · 842 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

 

اتمنى الجميع بخير 

 

عندي سؤال

 

وهو كيف يمكن لي تعريف أوبجكت داخل كلاس بحيث أن الاوبجكت يكون من كلاس يتواجد بعد الكلاس المعرف ؟

 

على سبيل المثال

#include<iostream>
#include<cmath>
#include<conio.h>
using namespace std;

const int PI=3.14159265;

class Polar
{
    double radius;
    double angle;
public:
	Polar(double r=0,double an=0):radius(r),angle(an){}

	Polar(Rectangular R2)		//Rectangular is defined after this class
	{
		radius=sqrt(pow(R2.getX(),2.0)+pow(R2.getY(),2.0));
		angle=atan(R2.getY()/R2.getX());
	}			


	void setRadius(double r)
	{
		radius=r;
	}

	double getRadius()
	{
		return radius;
	}

	void setAngle(double an)
	{
		angle=an;
	}

	double getAngle()
	{
		return angle;
	}

    Polar operator + (Polar p1)
	{
		return Polar((Rectangular(Polar(radius,angle))+Rectangular(p1)));
	}

	void display()
	{
		cout<<'('<<radius<<' , '<<angle<<')'<<endl;
	}

};

class Rectangular
{
	double x;
	double y;
public:
	Rectangular(double X_axis=0,double Y_axis=0):x(X_axis),y(Y_axis){}

	Rectangular(Polar p1)
	{
		x=p1.getRadius()*cos(p1.getAngle()*PI/180);
		y=p1.getRadius()*sin(p1.getAngle()*PI/180);
	}

	Rectangular operator + (Rectangular R1)
	{
		return Rectangular(x+R1.x,y+R1.y);
	}

	double getX()
	{
		return x;
	}

	double getY()
	{
		return y;
	}
};

int main()
{
	Polar p1(4,45),p2(5,30);
	Polar result;

	result=p1+p2;
	result.display();

	system("pause");
	return 0;
	}

تم تعديل هذه المشاركة بواسطة المـقـدام في 7 أبريل 2014 في 21:53

 إن المعلم والطبيب كلاهمــــا ... لا ينصحـان إذا همـا لم يكرمـا 


فاصبر لدائـك إن أهنت طبيبه ... واصبــر لجهلك إن جفوت معلما

#2 أفضل إجابة

أنظر الكود التالي:

class Rectangular;

class Polar
{
	Rectangular toRect();
};

class Rectangular
{
};

Rectangular Polar::toRect()
{
	// implement here
}

أول سطر يسمى بـ forward declaration للفئه Rectangular حتى تستطيع إستخدامها مع المتغيرات و القيم المعاده من الدوال و لكنك لن تستطيع إستخدام ذلك المتغير او كتابة كود للدالة حتى يتم إكمال تعريف الفئه و إلا سينتج عنه خطأ لاستخدام نوع غير كامل و لهذا تم تعريف الدالة toRect بعد تعريف الفئه Rectangular.

 

 

و الله ولي التوفيق

3

مدونتي: C++ Tips and Tricks

#3

بدلاً من أن تنشئ فئتين منفصلتين، يمكنك التخلص من احدهما طالما أنه يمكن التحويل بسهولة بين النظامين وتضيف دالة static تعمل كـfactory، تحول الإحداثيات القطبية للديكارتية. مثلاً:

static Vector create_from_polar(double angle, double length)
{
  return Vector(
    cos(angle * M_PI / 180) * length,
    sin(angle * M_PI / 180) * length
  );
}

الآن لن تحتاج للفئة الثانية:

#include <cstdio>
#include <cmath>

class Vector
{
public:
  double x;
  double y;

  Vector(double x, double y) : x(x), y(y)
  {

  }

  static Vector create_from_polar(double angle, double length)
  {
    return Vector(
      cos(angle * M_PI / 180) * length,
      sin(angle * M_PI / 180) * length
    );
  }

  double length() const
  {
    return sqrt(x * x + y * y);
  }

  double angle() const
  {
    return atan(y / x) * 180 / M_PI;
  }
};

int main()
{
  Vector v1(0, 5);
  Vector v2 = Vector::create_from_polar(90, 5);

  printf("polar = (%.2f, %.2f), rect = (%.2f, %.2f)\n",
    v1.length(), v1.angle(), v1.x, v2.y);

  printf("polar = (%.2f, %.2f), rect = (%.2f, %.2f)\n",
    v2.length(), v2.angle(), v2.x, v2.y);
}
1

هذا الموضوع مغلق.

مواضيع مشابهة