[C++] حل "يمكن فقط تهيئة بيانات ثابتة لا يتجزأ من كونست ضمن فئة" خطأ تجميع



Answers

  • خطأ C2864: إما إضافة معدل تعديل const إلى عدد صحيح، أو نقل التهيئة خارج الفئة (كما في class Tester { static int number; }; int Tester::number = 5; ). يبدو هذا الأخير أكثر ملاءمة لقضيتك.
  • خطأ C2146: يفتقد فاصلة منقوطة بعد إعلان class Tester { ... } . يجب أن يكون class Tester { ... } ;

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

كملاحظة جانبية، لا أعتقد أنك تريد حقا معدل static على عضو الخاص بك. يبدو أكثر ملاءمة لحقل المثال. لا يزال لا يمكن تهيئة في مكان على الرغم من (هذا ليس C #)، لديك لنقل التهيئة إلى منشئ. فمثلا:

class Tester {
    int number;
    static int staticNumber; // just to show you how to use a static field

public:
    Tester() : number(5) {}
    ~Tester() {} // I suggest you remove the destructor unless you need it

    int getNumber() { return number; }
    void setNumber(int value) { number = value; }

    static int getStaticNumber() { return staticNumber; }
    static void setStaticNumber(int value) { staticNumber = value; }
};

// initialize static members *outside* the class
int Tester::staticNumber = 5;
Question

ما يلي لإنشاء كائن عالمي يؤدي إلى أخطاء في التجميع.

#include "stdafx.h" 
#include <iostream> 

using namespace System; 
using namespace std;    
#pragma hdrstop 

class Tester;


void input();

class Tester
{
    static int number = 5;

public:

    Tester(){};
    ~Tester(){};

    void setNumber(int newNumber)
    {
        number = newNumber;
    }

    int getNumber()
    {
        return number;
    }
}

Tester testerObject;

void main(void)
{
    cout << "Welcome!" << endl;

        while(1)
        {
            input();
        }
}

void input()
{
    int newNumber = 0;

    cout << "The current number is " << testerObject.getNumber();
    cout << "Change number to: ";

        cin >> newNumber;

    cout << endl;

    testerObject.setNumber(newNumber);

    cout << "The number has been changed to " << testerObject.getNumber() << endl;
}

في ما يلي أخطاء التجميع:

1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>Compiling...
1>test.cpp
1>.\test.cpp(15) : error C2864: 'Tester::number' : only static const integral data members can be initialized within a class
1>.\test.cpp(33) : error C2146: syntax error : missing ';' before identifier 'testerObject'
1>.\test.cpp(33) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>.\test.cpp(49) : error C2039: 'getNumber' : is not a member of 'System::Int32'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::Int32'
1>.\test.cpp(55) : error C2039: 'setNumber' : is not a member of 'System::Int32'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::Int32'
1>.\test.cpp(57) : error C2039: 'getNumber' : is not a member of 'System::Int32'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::Int32'
1>Build log was saved at "file://c:\Users\Owner\Documents\Visual Studio 2008\Projects\test\test\Debug\BuildLog.htm"
1>test - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
  1. كيف أقوم بإنشاء كائن فئة عالمي بشكل صحيح كما حاولت هنا.
  2. وكيف يمكنني إصلاح ذلك "يمكن فقط تهيئة أعضاء البيانات المتكاملة كونست ثابت ضمن فئة"
  3. وأساسا كيف يمكنني إصلاح بقية الأخطاء حتى أتمكن من الحصول على هذا لتجميع؟

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

إذا كان يمكنني الحصول على هذا فقط لتجميع ... ثم أستطيع أن تتعلم بنجاح كيفية القيام بذلك. حتى إذا كان شخص ما يمكن إعادة كتابة ما سبق إلى حيث حرفيا نسخ والمعاجين في فيسوال C ++ إكسبريس 2008 ويعمل وسوف تكون أخيرا قادرة على معرفة كيفية إعادة إنشائه. أنا متحمس للغاية على رؤية الإصلاح لهذا! هو فقط لا أستطيع الحصول على الكائنات العالمية للعمل الحق! أي معلومات أخرى عن إعلان الأجسام الفئة العالمية ... أو أي شيء لهذه المسألة هو موضع ترحيب!




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

header.h:

// ensure the file is only included once
#ifndef _HEADER_H
#define _HEADER_H

extern int foo;

#endif
// end file header.h

header.cpp

#include "header.h"

int foo = 1;

// end file header.cpp

MAIN.CPP

#include "header.h"
#include <stdio.h>

int main(int argc, char** argv)
{
  printf("%d", foo);
  return 0;
}

// end file main.cpp

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




Links