Разрешение «только статические константные интегральные данные могут быть инициализированы в классе» ошибка компиляции - PullRequest
6 голосов
/ 31 января 2009

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

#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. А в принципе как мне починить остальное из ошибок, чтобы я мог получить это компилировать

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

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

Ответы [ 4 ]

11 голосов
/ 31 января 2009

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

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

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

int Tester::number = 5;

Задача № 2:

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

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

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

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

1 голос
/ 31 января 2009
  • Ошибка 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;
0 голосов
/ 31 января 2009

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

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

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

0 голосов
/ 31 января 2009

В соответствии с этим: 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;

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

...