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

مشكلة مع الكلاس

بدأه أبو دحيم في 8 أغسطس 2010 · 16 رد · 823 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أهلا بكم إخواني

أقوم حالسا بدراسة الكلاس في السي++ ولكن واجهة مشكلة

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

class x
{
private:
int y[10];
public:
x()
{
y={1,2,3,4,5,6,7,8,9,10};
}
};

عندما أعمل هكذا يعطيني خطأ لكن ما هي الطريقة الصحيحة لعمل ذلك

ولدي إستفسار آخر أيضا :blush:

إذا حددت نوع هذه المصفوفة على أنها static كيف سأعرفها أيضا :wink:

بإنتظاركم أحبائي :)

#2

عندما تعرف مصفوفة بهذه الطريقة

int z[] = {1,2,3,4,5,6};

فأنت تترك للCompiler مهمة تحديد حجم المصفوفة لأنك في نفس السطر قمت بوضع عناصر المصفوفة, و هنا يمكن للCompiler ببساطة عد العناصر.

لكن في الحالة التي وضعتها, أنت قمت بالفعل يتحديد حجم المصفوفة في أثناء تعريفها

class x
{
private:
int y[10];
}

فعندما تقوم بوضع السطر في دالة البناء

y={1,2,3,4,5,6,7,8,9,10};

فهنا لن يسمح لك الCompiler باعادة تحديد حجم المصفوفة حتى لو كان هذا الحجم مساوٍ للحجم الأصلي, لأنك بالفعل حددت حجمها في السابق.

و في هذه الحالة كل ما عليك فعله هو ملء المصفوفة بالعناصر بشكل طبيعي

class x
{
private:
	int y[6];
public:
	x()
	{
		y[0] = 1;
		y[1] = 2;
		y[2] = 3;
		....
	}
};
1

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#3

كيف الحال أبا دحيم:

بالفعل كما قال الأخ متميز

+ ألا تعلم أن إسم المصفوفه مجرداً إنما هو إلا مؤشر لعنوان أول عنصر بالمصفوفه.... لذا لا تستطيع أن تضع بعنوان أول عنصر بالمصفوفه مصفوفه بأكلمها....

#include <stdio.h>

int main(void)
{
	int arr[10];

	printf("%p %p\n", arr, &arr[0]);

	return 0;
}

تم تعديل هذه المشاركة بواسطة هويدي في 8 أغسطس 2010 في 18:48

#4

جزاكم الله خيرا على الرد

بالنسبة لهذا الأمر

int z[] = {1,2,3,4,5,6};

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

الذي أعرفه أنا أنه لا يمكن أن تقوم بعمل initialization في الستركت أو الكلاس أي لا يمكنك إلا أن تعمل إسناد ( وهو ما وضعته أخي الكريم في الكود الأخير ) ولكن هذه الطريقة مزعجة وطويلة جدا حقيقة

وأيضا أخي الكريم أرى أنك تحدثت عن حجم المصفوفة لكن ما علاقة هذا بسؤالي ما الذي تريد أن تصل إليه :unsure:

أخي هويدي

صحيح كلامك وأعرف هذا الشيئ لكن أنا وضعت مثال هنا

هل هنالك حل آخر غير ما ذكره أخي متميز لأنه حل طويل حقيقة ومتعب إن كنت تريد أن تعرف مصفوفة كبيرة نسبيا

شكرا لكم :)

#5

من هنا http://www.gidforums.com/t-2981.html ، فالأمر صعب ..

اقتباس

I don't think this is possible. C++ does not allow you to initialize a function member which in turn would make that static inside a class. A class is not meant to have any static variables.

The only time that you can initialize an array is at the time that you define it. For that reason, the second one is invalid. The only work around that I can see is to assign the integers one at a time...

عندي فكرة : إضافة إلى عمل looping ، قد لا تكون العناصر داخل المصفوفة منتظمة أو تحمل نسقاً معيناً ، لذا الدوران وحده لا يكفي ، لذا :

class x
{
private:

	int y[10];

public:

	x()
	{
		int z[] = {1,8,3,11,15,9,7,2,6,10};

		for(int i=0; i<10; i++)
			y = z;
	}
};

وسلامتك ..

تم تعديل هذه المشاركة بواسطة namespace في 8 أغسطس 2010 في 23:40

1

البرمجة = الرياضيات

#6
اقتباس
وأيضا أخي الكريم أرى أنك تحدثت عن حجم المصفوفة لكن ما علاقة هذا بسؤالي ما الذي تريد أن تصل إليه

المشكلة كلها في حجم المصفوفة يا أخي :)

في أغلب اللغات و من ضمنها ++C\C لا يمكنك تغيير حجم المصفوفة بعد تعريفها, و لهذا يُعطي لك المترجم فرصة واحدة لتحديد حجم المصفوفة في خلال برنامجك, و طريقة تحديد هذا الحجم تكون اما عن طريق وضع هذا الحجم في أثناء تعريف المصفوفة

مثل هذا المثال

int y[10];

او عن طريق تحديد عناصر المصفوفة أثناء تعريفها و سيقوم المترجم بعد العناصر و حجز المساحة المناسبة مثل هذا المثال

int z[] = {1,8,3,11,15,9,7,2,6,10};

لكن عندما تستخدم الطريقتين سوياً مثلما فعلت في مثالك الأصلي سيظن المترجم أنك تحاول اعادة تحديد حجم المصفوفة و هو ضد قواعد اللغة

1

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#7

السلام عليكم

أخي namespace

جميلة جدا فكرتك أعجبتني :)

شكرا لك أخي :)

أخي متميز

حتى الآن لم أفهم ما تصبوا إليه جربت عدة مرات أن أضع مصفوفة دون أن أحدد النوع ولكن كما كنت متوقع أجد خطأ لأنه يجب أن تضع قيم ابتدائية عندما لا تضع حدا لها :)

هل بإمكانك شرح ما تريد أن تصل إليه ببرنامج بسيط :blush:

شكرا لك

هنالك أمر آخر إخواني

هل أيضا عندما أضع المتغير static يجب علي تعرفته بهذه الطريقة أم أن الstatic قد يتيح لي طرقا أسهل :)

شكرا لكم إخواني

#8

لا اعتقد أني ذكرت اي شئ عن مصفوفة بدون نوع لا أدري أي جزء بالضبط في ردودي أوصل إليك هذه الفكرة

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#9
namespace كتب:

من هنا http://www.gidforums.com/t-2981.html ، فالأمر صعب ..

عندي فكرة : إضافة إلى عمل looping ، قد لا تكون العناصر داخل المصفوفة منتظمة أو تحمل نسقاً معيناً ، لذا الدوران وحده لا يكفي ، لذا :

class x
{
private:

	int y[10];

public:

	x()
	{
		int z[] = {1,8,3,11,15,9,7,2,6,10};

		for(int i=0; i<10; i++)
			y = z;
	}
};

وسلامتك ..

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

قمت بتعديل مشاركتي بعد أن لاحظت أن المصفوفة z كانت غير مرتبة وغير متسلسلة

آسفة لم أنتبه كنت مع نفس المصفوفة التسلسلية في أصل الموضوع... تركيزي شوي ضعيف هالأيام :happy:

نعم صيحيح!

إما إذا كنت تسلسلية...

الأفضل نعمل جملة تكرار for مناسبة لتخزين قيم من 1 إلى 10 في المصفوفة y ذات العشر عناصر, على النحو التالي

class x
{
private:

	int y[10];

public:

	x()
	{


		for(int i=0; i<10; i++)
			y = i + 1;
	}
};

المكرم أبو دحيم, مشاركات المكرم motamayez واضحة وهو يقصد الحجم ولم يتحدث عن إلغاء نوع البيانات...تحديد حجم المصفوفة أي تحديد عدد عناصر المصفوفة بعد اسم المصفوفة داخل الأقواس المربعة هكذا -> [10] تكون مرة واحدة فقط عند تعريف المصفوفة, أما طريقتك انت وهي كتابة عناصر المصفوفة جملة واحدة داخل الأقواس المجعدة مرة أخرى بعد التعريف السابق, فإنك تحاول هنا إعادة تعيين حجم المصفوفة وهنا يحدث التعارض عن الكمبايلر. :happy:

بخصوص static سأحاول الرجوع إليها لاحقاً إذا لم يسبقني عليها أحد! لأنا بتحتاج إلى شرح بعض الشيء...

آسفة للتقصير

موفقين يارب

تم تعديل هذه المشاركة بواسطة ♥رغـد♥ في 9 أغسطس 2010 في 03:56

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#10
اقتباس
هل أيضا عندما أضع المتغير static يجب علي تعرفته بهذه الطريقة أم أن الstatic قد يتيح لي طرقا أسهل :)
اقتباس

حسبما أذكر .. فإن نوع البيانات الوحيدة التي يسمح أن تُعطى بقيمة ابتدائية في الكلاس وقت تعريفها هي الـ const static

#11
motamayez كتب:

لا اعتقد أني ذكرت اي شئ عن مصفوفة بدون نوع لا أدري أي جزء بالضبط في ردودي أوصل إليك هذه الفكرة

آسف أخي الكريم كنت أقصد من دون حجم وليس من دون نوع :blush:

أختي رغد

أنا كنت أقصد حجم البيانات وليس نوعها أخطأت بالكتابة لا أعلم كيف :)

أنا وضعت قيم متسلسلة فقط للمثال ولكني لا أريد قيما متسلسلة :)

شكرا لك

أخي أحمد

كيف أعمل هذا فهذا هو المناسب لي static const :)

شكرا لكم إخواني

#12
 #include"stdafx.h"
#include<iostream>
using namespace std;
class type
{
private:
 static const int a=5;
public:
 type()
 {

 }
 void print()
 {
  cout<<a;
 }
};
void main()
{
 type a1,a2;
 a1.print();
 cout<<endl;
 a2.print();

}

تفضل هذا هي الطريقة لكنها تصلح للمتغيرات فقط .. أي لا تصلح للمؤشرات " مصفوفات " لكن أعتقد أنه يمكن أن نتلاعب لكي نجعلها تقبل

#13

لا تستخدم static const الا اذا كنت تريد ان تكون هذه المصفوفة مشتركة بين كل كائن من الفئة اما اذا كنت تريد ان يكون لكل كائن مصفوفة خاصة به فيجب عليك تعريف المصفوفة دون استخدام static

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#14
motamayez كتب:

لا تستخدم static const الا اذا كنت تريد ان تكون هذه المصفوفة مشتركة بين كل كائن من الفئة اما اذا كنت تريد ان يكون لكل كائن مصفوفة خاصة به فيجب عليك تعريف المصفوفة دون استخدام static

هذا ما أريده لأنه قيمة ثابتة ( مثل رقم باي 3.14 ) في كل مكان وزمان تستخدم نفس القيم :)

شكرا لك

أخي أحمد

المشكلة أنني أتعامل مع مصفوفة :(

شكرا لك

#15

تفضل هذا للمصفوفات static

#include"stdafx.h" 
#include<iostream> 
using namespace std; 
class type 
{ 
private: 
 static  int a[];

public: 
 type() 
 { 

 } 
 void print() 
 { 
  for(int i=0;i<4;i++)
 cout<<a;
 } 
};
 int type::a[] = { 6 ,5 , 3 , 1 }; 
void main() 
{ 
 type a1; 
 a1.print(); 


}

تم تعديل هذه المشاركة بواسطة aohammed في 9 أغسطس 2010 في 22:23

#16
aohammed كتب:

تفضل هذا للمصفوفات static

#include"stdafx.h" 
#include<iostream> 
using namespace std; 
class type 
{ 
private: 
 static  int a[];

public: 
 type() 
 { 

 } 
 void print() 
 { 
  for(int i=0;i<4;i++)
 cout<<a;
 } 
};
 int type::a[] = { 6 ,5 , 3 , 1 }; 
void main() 
{ 
 type a1; 
 a1.print(); 


}

شكرا لك أخي الكريم

هذا ما كنت بحاجته حقا :)

لك ودي :wub:

#17

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

يمكنك وضع القيم سواء بواسطة دالة البناء او دالة اخرى.


#include <iostream>

using namespace std;
/*Prototype*/
class myClass
{
public:
myClass(); //ctor
void init();
void print();
virtual ~myClass();//dtor
private:
int *array;
unsigned int size;

};


int main()
{
myClass object;
object.init();
object.print();
return 0;
}
/*implementation*/

myClass::myClass()
{
array =new int[10];
size=10;
}
void myClass::init()
{
for(unsigned int i=0;i!=size;i++)
{
array=i+1;
}
}
void myClass::print()
{
for(unsigned int i=0;i!=size;i++)
{
cout<<array<<";";
}
}

myClass::~myClass()
{
delete[] array;
}



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