سؤال

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

class Player
{
   private:
      static int numPlayers;
   public:
      Player() { numPlayers++; }
};

int Player::numPlayers = 0;
هل كانت مفيدة؟

المحلول

المشكلة هي أنك لا تفصل الإعلان عن التعريف الخاص بك.النظر:

class Player
{
   private:
      static int numPlayers;
   public:
      Player() { numPlayers++; }
};

رمز أعلاه مجرد تعلن وجود "numPlayers" في فئة "لاعب".لا, ومع ذلك ، حجز أي مساحة أو تعيين عنوان الذاكرة إلى متغير "لاعب::numPlayers".ومع ذلك:

int Player::numPlayers = 0;

رمز أعلاه هو تعريف -- انها تحتفظ مساحة الكائن لاعب::numPlayers ويعين عنوان فريد على هذا الكائن.وجود هذا الخط تظهر أكثر من مرة في برنامج ينتهك واحد-تعريف القاعدة.الآن ما هو الأكثر احتمالا أن يحدث هو أن يتم إدراج هذا الملف...

يجب عليك أبدا أن تشمل ".ج", ".cpp", ".م", ".مم" أو أي "مصدر" ملف (أيملف يحتوي على التعاريف).يجب أن تشمل فقط "رأس" الملفات (أيالملفات التي تحتوي على بحتة الإعلانات).لكثير من بناء أنظمة ، بما في ذلك كسكودي, كل مصدر الملف تلقائيا تجميع وربط في المشروع.إذا قمت بتضمين الملف المصدر من مصدر آخر ملف ، ثم التعاريف الحصول على ربط في مرتين الأولى عندما جمعت من تلقاء نفسها ثم مرة أخرى عندما يتم الإشارة إليها بواسطة مصدر آخر الملف.

منذ كنت تسأل عن كسكودي...يمكنك تصحيح هذه المشكلة عن طريق إلغاء تحديد الملف المصدر في تفاصيل مشروع الرأي ؛ علامة الاختيار بجانب الملف المصدر إلى أنه سيتم تجميع وربط في الهدف الحالي.ومع ذلك, أقترح بشدة أن يمكنك ترك الخاص بك ".مم" ملف فحص خلق ".ح" الملف التي يمكنك وضع الإعلانات ، وتشمل ".ح" الملف بدلا من بما في ذلك ملف مصدر واحد من آخر.

نصائح أخرى

هل حددت عدة مرات؟ أي تحديده في ملف الرأس وتشمل في ملفات CPP متعددة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top