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

مساعدة ...constant Data Member Of Class

مغلق
بدأه sunrise2007 في 4 نوفمبر 2007 · 6 رد · 914 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اذا ممكن يا أخوان تخبروني عن حل للمشكلة في هذا الكود

شاكرة تعاونكم

#include<iostream>
#include<string>
using namespace std;

class book
{
	const int id;
	string title;
	static int ID;

		public:
		book():id(ID)
		{
		}
		book(string t):id(ID)
		{
			title=t;
			ID++;
		}
};
int book::ID=123;
int main()
{
	book b[3];
	string t;
	for(int i=0;i<3;i++)
	{
		cout<<"Enter the title of book\n";
		cin>>t;
		b=book(t);
	}
	return 0;
}

تم تعديل هذه المشاركة بواسطة sunrise2007 في 4 نوفمبر 2007 في 16:18

#2

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

يا اخى المشكلة بسيطة, هذا المتغير id انت اعنت عنه const و انا لا ارى سببا وجيها لذلك

فى العادة فى سى++ تنشئ لك دالة تسمى operator= هذه الدالة يتم نداءها كلما حصلت عملية

مساواة كان طرفها الايسر خاص بالكلاس تبعك, انت هنا لم تعرف هذه الدالة لذلك اضاف لك الكومبايلر دالة كالتى كتبتها لك

و لكن فى هذه الدالة مشكلة واضحة انها تكسر قاعدة cont و هذاهو الخطأ فى هذا الكود

هناك واحد من حلان

الاول و انا اراه مناسا, هو ان تلغى كلمة const وكل شئ تمام

الثانى هو ان تلغى المساواة التى تعمل المشاكل, و هنا عليك ان تدبر معنى علامة يساوى جيدا

فى النهاية المسالة مسالة تصميم جيد للكود

#include<iostream>
#include<string>
using namespace std;

class book
{
	const int id;
	string title;
	static int ID;

		public:
		book():id(ID)
		{
		}
		book(string t):id(ID)
		{
			title=t;
			ID++;
		}



	/*uncomment this function to setup your default 
	operator = handler which is called whenever you 
	want to assigin an object for an other

	const book& operator=(const book& b)
	{
		title = b.title;

		cout<< "operator = has been called  \n now it is dion ok \a\n";
		id = b.id;	//comment this line to fix the problem
		return *this;
	}
	*/

};

int book::ID=123;

int main()
{
	book b[3];
	string t;
	for(int i=0;i<3;i++)
	{
		cout<<"Enter the title of book\n";
		cin>>t;
		b=book(t);
	}
	return 0;
}
#3

ألف شكر أخ justnow على حلك فهمت عليه..

طيب اذا كانت عندي dyanmic array of objects

أنا سمعت عن انdyanmic array أخليها تأشر على موشرات بعدين أعبي المصفوفة كائنات بس ما عرفت أطبق الحل أبغى أفهم هذي الطريقة أنا فاهمة المشكلة بس ماعرفت أحلها

يعني مثلا نفس الكود مع المحافظة على const بس في main يصبح هكذا

#include<iostream>
#include<string>
using namespace std;

class book
{
	const int id;
	string title;
	static int ID;

		public:
		book():id(ID)
		{
		}
		book(string t):id(ID)
		{
			title=t;
			ID++;
		}



};

int book::ID=123;

int main()
{
	book *b;
	string t;
	int size;
	cout<<"Enter the number of books\n";
	cin>>size;

	b=new book[size];

	for(int i=0;i<size;i++)
	{
		cout<<"Enter the title of book\n";
		cin>>t;
		*(b+i)= book(t);
	}
	return 0;
}

جزاكم الله خير..

#4

الكود سليم وليس فيه خطأ, لم افهم ما المشكلة التى تواجهينها بالضبط

لكن على كل حال انا عدلت قليل فى البرنامج حتى نتاكد ان المصفوفة تحمل القيم السابقة

شئ اخير, لا تنسى تحرير الزاكرة المحجوزة , الزاكرة المحجوزة ب new يجب ان تحرر ب delete

و الزاكرة المحجوزة ب malloc يجب ان تحرر ب free. عدم تحرير الزاكرة يمكن ان يسبب كوارث فى البرمجة ب C++

لذلك كن حذرا

ربما كان فى هذا البرنامج الصغير تحرير الزاكرة ليس مهم لان النظام سوف يفعل ذلك حالما ينتهى تنفيذ البرنامج

لكن, فكر فى البرامج التى تنفذ لفترات طويلة, مثل خواد الوب , خوادت قواعد البيانات التى قد تعمل لسنين من غير توقف

على العموم هذا هو الكود بعد القليل من التعديل

#include<iostream>
#include<string>
using namespace std;

class book
{
public:
	int id;
	string title;
	static int ID;

		public:
		book():id(ID)
		{
		}
		book(string t):id(ID)
		{
			title=t;
			ID++;
		}



};

int book::ID=123;

int main()
{
	book *b;
	string t;
	int size;
	cout<<"Enter the number of books\n";
	cin>>size;

	b=new book[size];

	for(int i=0;i<size;i++)
	{
		cout<<"Enter the title of book\n";
		cin>>t;
		b= book(t);
	}

	for( int i =0; i < size; i++)
	{
	cout<< "The Book["<<i<<"]"<<"has title"<<b.title<<"\n";
	}

	delete [] b;
	b = 0;
	return 0;
}
#5

المشكلة في constant انا أريد أن تبقى موجودة

يعني انا الحين في main عملت مصفوفة من نفس الكلاس أول مأ أعرفها انادي default constructor

ثم بعد ذلك أريد أنا أدخل على كل object وأعطي قيمة لأسمه من خلال paramter constructor

لكن لان عندي constant فما تنفع المساواة

أنا عرفت طريقة حلك بالرد الأول

لكن أريدها بطريقة أخرى

يعني مثلا أعرف مؤشر من نفس الكلاس يحتوي على مؤشر يؤشر يأشر على مصفوفة تحتوي على كائنات واعطي قيمة للاسم مباشرة بدون ما يطلع خطا

لا أعرف كيف أصيغ الحل الأخر؟؟؟

ألف شكر على مجهودك وجزاك الله خير

#6

لم افهم شيئ

#7

طيب أخر محاولة أخ justnow تقريبا مثل هذي المشكلة...

Write a book class which contains a title and a constant id, which is a serial number automatically generated by the class, and a print function to display the book's information.

Create an array of five books, and populate it with books objects. The user should be able to specify the title of the book at runtime.

انا عرفت كل شي الا المصفوفة ((المطلوب اللي تحته خط))...

واثابك الله على تعاونك ماقصرت

وارجوا ممن لديه مساعدة لا يبخل علينا

شكرا لتعاونكم...

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

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