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

الخطأ C2678

بدأه Abboodd في 30 مارس 2010 · 2 رد · 437 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

كيف حالكم؟

أثناء قيامي بتطبيق على مصفوفة ديناميكية بسيطة، واجهني خطأ لم أعرف سببه أو حله، إليكم الشفرة:

class DArray
{
public:

	DArray(int);
	~DArray();

	int GetNumOfElements() const {return itsNumOfElements;}
	void SetNumOfElements(int newNum) { itsNumOfElements=newNum;}

	int& operator [] (int);
	bool operator == (const DArray&);
	bool operator < (const DArray&);

private:
	int *itsArray;
	int itsNumOfElements;
};


DArray::DArray(int NumberOfElements)
{
	itsArray = new int [NumberOfElements];
	itsNumOfElements = NumberOfElements;
}


DArray::~DArray()
{
	delete [] itsArray;
}


int& DArray::operator [] (int nIndex)
{
	return itsArray[nIndex];
}


bool DArray::operator ==(const DArray& comparator)
{
	if (this->GetNumOfElements() == comparator.GetNumOfElements())
	{
		bool equals=true;
		for (int counter = 0 ; counter < this->GetNumOfElements() ; counter++)
		{
			if (this->operator [] != comparator[counter])
			{
				equals = false;
				break;
			}
		}
		return equals;
	}
	else
		return false;
}


bool DArray::operator < (const DArray& comparator)
{
	if (this->GetNumOfElements() < comparator.GetNumOfElements())
		return true;
	else if (this->GetNumOfElements() == comparator.GetNumOfElements())
	{
		int total1 = 0 , total2 = 0;

		for (int counter = 0 ; counter < this->GetNumOfElements() ; counter++)
		{
			total1 += this->operator [](counter);
			total2 += comparator[counter];
		}

		return (total1 < total2);
	}
	else
		return false;
}

يظهر الخطأ التالي:

error C2678: binary '[' : no operator defined which takes a left-hand operand of type 'const class DArray' (or there is no acceptable conversion)

وذلك في السطرين اللذين يتم استدعاء المعامل [] فيهما:

this->operator [] (counter)

فما الحل؟؟

ولكم جزيل الشكر :)

تم تعديل هذه المشاركة بواسطة Abboodd في 30 مارس 2010 في 00:24

هذه الجملة خاطئة  :wacko: 


#2

السلام عليكم ...

هناك ملاحظتان,

الملاحظة الأولى, هي أن:

bool DArray::operator ==(const DArray& comparator)

تعرف comparator على أنه كائن const, بالتالي لا يمكن استدعاء أي دالة من دواله الغير معرفة على أنها const. لذلك نقوم بإضافة دالة جديدة للمعامل [] بحيث تكون const:

int operator [] (int nIndex) const;

const في آخر التعريف تعني أن الدالة لا تغير الكائن, و بالتالي يصبح باستطاعتنا مناداتها على كائنات معرفة على أنها const.

الملاحظة الثانية, هي أن:

this->operator []

خاطئة لغوياً, يمكنك كتابتها بالطريقتيتن التاليتين:

(*this)[counter]

أو ببساطة:

itsArray[counter]

مع التعديل يصبح الكود لديك:

class DArray
{
public:

	DArray(int);
	~DArray();

	int GetNumOfElements() const {return itsNumOfElements;}
	void SetNumOfElements(int newNum) { itsNumOfElements=newNum;}

	int& operator [] (int);
	int operator [] (int nIndex) const; // 1
	bool operator == (const DArray&);
	bool operator < (const DArray&);

private:
	int *itsArray;
	int itsNumOfElements;
};


DArray::DArray(int NumberOfElements)
{
	itsArray = new int [NumberOfElements];
	itsNumOfElements = NumberOfElements;
}


DArray::~DArray()
{
	delete [] itsArray;
}


int& DArray::operator [] (int nIndex)
{
	return itsArray[nIndex];
}

int DArray::operator [] (int nIndex) const
{
	return itsArray[nIndex];
}


bool DArray::operator ==(const DArray& comparator)
{
	if (this->GetNumOfElements() == comparator.GetNumOfElements())
	{
		bool equals=true;
		for (int counter = 0 ; counter < this->GetNumOfElements() ; counter++)
		{
			if ( itsArray[counter] != comparator[counter]) // 2
			{
				equals = false;
				break;
			}
		}
		return equals;
	}
	else
		return false;
}


bool DArray::operator < (const DArray& comparator)
{
	if (this->GetNumOfElements() < comparator.GetNumOfElements())
		return true;
	else if (this->GetNumOfElements() == comparator.GetNumOfElements())
	{
		int total1 = 0 , total2 = 0;

		for (int counter = 0 ; counter < this->GetNumOfElements() ; counter++)
		{
			total1 += itsArray[counter]; // 3
			total2 += comparator[counter];
		}

		return (total1 < total2);
	}
	else
		return false;
}

و بهذا تصحح جميع الأخطاء اللغوية في الكود.

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 30 مارس 2010 في 01:08

3
#3

جزاك الله خيراً أستاذ خالد، أظنني فهمت الأمور بشكل جيد.

هذه الجملة خاطئة  :wacko: 


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