اذهب إلى المحتوى
  • 0

التحميل الزائد للمعاملات في ++c

محمد عنيبة

السؤال

هذا برنامج استخدمت فيه التحميل الزائد للمعاملات لكن واجهتني مشكلة ألا وهي أني عندما أجعل نوع القيمة المعادة Counter يظهر خطأ 

  class "Counter" has no suitable copy constructor      
رغم أنه يفترض -في هذه الحالة-أن تستدعى دالة البناء العادية لا الناسخة فلماذا تستدعى الناسخة ويخبرك أنها غير ملائمة؟

بالإمكان حل المشكلة بحذف الدالة البانية الناسخة the copy constructor التي أنشأتها وترك مهمة النسخ لو احتجتها للدالة التي تنشئها البيئة default copy constructor أو أني نغير القيمة المعادة لـint وأجعلها تعيد الcount مباشرة لكنه ليس الحل المثالي للمشكلة

#include <iostream>
using namespace std;
class Counter
{
private:
	int count; //count
public:
	Counter() : count(0) { } //constructor
	Counter(int a) : count(a) {  } //constructor
	Counter(Counter& c ) {
		this->count = c.count;
		cout << endl<<"Copy constructor has been invoked"<<endl;
	} //constructor*/

	int get_count() //return count
	{
		return count;
	}
	Counter operator ++ () //increment (prefix)
	{

		return Counter(++count);
	}
	int operator ! () //increment (prefix)
	{
		if (count == 0)
			return(1);
		else
			return(0);
	}
	Counter operator -- () //increment (prefix)
	{

		return Counter(--count);
	}
	Counter operator ++ (int) //increment (prefix)
	{

		return Counter(count++);
	}
	Counter operator -- (int) //increment (prefix)
	{

		return(count--);
	}
	Counter operator + (Counter x) {
		int c;
		c = count + x.count;
		return  Counter(c);
	}
};

int main()
{
	Counter i;
	Counter c1, c2, c3; //define and initialize
	cout << "\nc1=" << c1.get_count(); //display
	cout << "\nc2=" << c2.get_count();
	++c1; //increment c1
	++c2; //increment c2
	++c2; //increment c2
	cout << "\nc1=" << c1.get_count(); //display again
	cout << "\nc2=" << c2.get_count();
	i = ++c2; // error
	cout << "\ni= " << i.get_count();
	--c1;
	Counter c4 = c2;
	cout << "\nc4=" << c4.get_count() << endl; //display again
	cout << "\nc2=" << c2.get_count() << endl;
	i = c2++;
	c2++;
	cout << "i= " << i.get_count();
	cout << "\nc2=" << c2.get_count() << endl;
	//c4 = !c2;
	cout << "\nc4=" << c4.get_count() << endl;
	c3 = c1 + c2;
	cout << "\nc1=" << c1.get_count();
	cout << "\nc2=" << c2.get_count();
	cout << "\nc3=" << c3.get_count();
	return 0;
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

لا توجد أي إجابات على هذا السؤال بعد

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...