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

[ تمت الإجابة ]مشكلة في الأعضاء الساكنة static members

بدأه مصطفى 36a2 في 25 سبتمبر 2012 · 3 رد · 1,049 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

static members

داخل class يعطيني خطأ في مرحلة الLinking

هذا كود مثال بسيط:


{
private:
static s;
public:
a(){s=0;}
};
main()
{
a s;
return 0;
}
class a

وهذا نص الخطأ كما يعطيه VS6لمن أراد :

اقتباس

Compiling...
Test.cpp
Linking...
Test.obj : error LNK2001: unresolved external symbol "private: static int a::s" (?s@a@@0HA)
Debug/Test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Test.exe - 2 error(s), 0 warning(s)
--------------------Configuration: Test - Win32 Debug--------------------

ما سبب هذا الخطأ ... فقد دفعني لاستعمال global variable وكسر قواعد OOP

وشكراً ..

#2

يلزمك أن تضيف الـa خارج الـclass في البرنامج:

class a
{
private:
        static int s;
public:
        a(){s=0;}
};

int a::s; //

main()
{
        a s;
        return 0;
}

إنتبه أنه لايوجد هناك الا عنصر واحد ثابت, حتى لو كان لديك أكثر من كائن:

#include <iostream>
using namespace std;

class MyClass {
private:
    static int member;
public:
    MyClass(void);
    int getMember(void);
    void setMember(int member);
};

MyClass::MyClass(void)
{
    this->member = 0;
}

int MyClass::getMember(void)
{
    return this->member;
}

void MyClass::setMember(int member)
{
    this->member = member;
}

int MyClass::member;

int main(int argc, char **argv)
{

    MyClass first_obj;
    MyClass second_obj;

    cout << "first_obj's member  = " << first_obj.getMember() << endl;
    cout << "second_obj's member = " << second_obj.getMember() << endl;

    first_obj.setMember(10);

    cout << "first_obj's member  = " << first_obj.getMember() << endl;
    cout << "second_obj's member = " << second_obj.getMember() << endl; // 10 ??

    return 0;
}

للتوسع : http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/topic/com.ibm.xlcpp8a.doc/language/ref/cplr038.htm

#3

المشكلة هى عدم تعريفك للـمتغير خارج الـ Class و هو امر واجب

مثال

class a
{
private:
        static int s;
public:
        a(){s=0;}
};

int a::s;

int main()
{
	a A1;
}

تم تعديل هذه المشاركة بواسطة XMasterrrr في 25 سبتمبر 2012 في 14:25

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#4

يجب ان تعطى تعريف و قيمة ابتدائية لa::S, لحجز مكان لها, لأن مترجم سى++ يعامل الstatic و كأنها خارج الكلاس مع اشارة لها بداخله.

class a

{
private:

static int s;

public:


a(){s=0;}

};

int a::s=0;

main()

{
   a s;
   return 0;
}

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…