Разрешение" только статические члены интегральных данных const могут быть инициализированы в классе " ошибка компиляции

следующий для создания глобального объекта приводит к ошибкам компиляции.

#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:windowsmicrosoft.netframeworkv2.0.50727mscorlib.dll : see declaration of 'System::Int32'
1>.test.cpp(55) : error C2039: 'setNumber' : is not a member of 'System::Int32'
1>        c:windowsmicrosoft.netframeworkv2.0.50727mscorlib.dll : see declaration of 'System::Int32'
1>.test.cpp(57) : error C2039: 'getNumber' : is not a member of 'System::Int32'
1>        c:windowsmicrosoft.netframeworkv2.0.50727mscorlib.dll : see declaration of 'System::Int32'
1>Build log was saved at "file://c:UsersOwnerDocumentsVisual Studio 2008ProjectstesttestDebugBuildLog.htm"
1>test - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
  1. как создать глобальный класс Объект правильно, как я пытался здесь.
  2. и как я могу исправить это " только статический члены интегральных данных const могут быть инициализируется в классе"
  3. и в основном, как я могу исправить остальные ошибок, поэтому я могу сделать это компилировать?

I например, объявление объектов глобального класса в области файлов (мне нравится объявлять все глобалы в области файлов), потому что, когда мне нужно создавать отдельные исходные файлы и делать "extern", и все это становится чрезвычайно сложным и никогда не работает для меня. Хотя, я хочу выяснить, как это сделать, в конце концов... кажется, каждый учебник, на который я смотрю, не будет компилироваться, и если он не компилируется, я понятия не имею, как его воссоздать!

Если я могу получить это для компиляции...тогда я смогу успешно научиться сделать это. Поэтому, если кто-то может переписать выше, где он буквально копирует и вставляет в Visual C++ Express 2008 и работает, я, наконец, смогу понять, как его воссоздать. Я очень рад видеть исправление для этого! Просто я не могу заставить глобальные объекты работать правильно! Любая другая информация об объявлении объектов глобального класса...или что-нибудь в этом отношении приветствуется!

4 ответов


просто начните устранять ошибки один за другим. Многие ошибки просто каскадируются из начальных ошибок, поэтому похоже, что есть много проблем, когда есть только пара. Просто начните с самого начала:

1>.\test.cpp(15) : error C2864: 'Tester::number' : only static const integral data members can be initialized within a class

вы не можете инициализировать член в определении класса, если он не статический, const и один из интегральных типов. Оставьте "= 5" off of the declaration of number. Тогда вам нужно будет иметь определение Tester::number вне определения класса, вот так:

int Tester::number = 5;

Проблема #2:

1>.\test.cpp(33) : error C2146: syntax error : missing ';' before identifier 'testerObject'

почти точно то, что он говорит (отсутствующие ошибки с запятой могут быть немного неточными в том, где точка с запятой должна быть)-вам нужна точка с запятой после определения Tester класса.

исправьте это, и ваши проблемы с компиляцией исчезнут.

ключевая вещь-попытаться взять ошибки компилятора по одному сверху. Если вы получите больше чем 3 из них, вы, вероятно, можете просто игнорировать все после 3rd или около того, потому что начальная ошибка просто вызывает компиляцию в сорняки (и если это реальные ошибки, они появятся снова в следующей компиляции в любом случае).


  • ошибка C2864: либо добавить const модификатор в целое число или переместите инициализацию за пределы класса (как в class Tester { static int number; }; int Tester::number = 5;). Последнее кажется более подходящим для вашего случая.
  • ошибка C2146: вы пропускаете точку с запятой после объявления class Tester { ... }. Он должен быть!--3-->;

другие ошибки, вероятно, вызваны предыдущей ошибкой. Они должны исправляться автоматически, когда это исправлено.

As примечание, Я не думаю, что вы действительно хотите 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;

согласно этому: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr038.htm

Tester testerObject;
int Tester::number = 5;

Я не уверен, но я думаю, что остальные ошибки происходят из этой одной проблемы. Исправьте это и посмотрите, как далеко это вас заведет.


ответы уже здесь касаются того, почему ваш код не компилируется и как это исправить. однако я заинтригован вашими комментариями о "extern". это очень легко использовать, когда вы знаете как. вы объявляете в одном заголовке переменную extern'Ed. и затем вы инициализируете его в одном файле. любой другой файл может ссылаться на переменную, включая заголовок. например,