Разрешение" только статические члены интегральных данных 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 ==========
- как создать глобальный класс Объект правильно, как я пытался здесь.
- и как я могу исправить это " только статический члены интегральных данных const могут быть инициализируется в классе"
- и в основном, как я могу исправить остальные ошибок, поэтому я могу сделать это компилировать?
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. и затем вы инициализируете его в одном файле. любой другой файл может ссылаться на переменную, включая заголовок. например,