Синтаксическая ошибка при инициализации статической переменной - PullRequest
3 голосов
/ 11 декабря 2011

Определены два класса ..

    class Dictionary
    {
    public:
        Dictionary();
        Dictionary(int i);
// ...
    };

и

    class Equation
    {
        static Dictionary operator_list(1);
// ...

    };

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

ошибка C2059: синтаксическая ошибка: 'константа'

Но она хорошо компилируется, когда я использую конструктор по умолчанию в operator_list.

Ответы [ 3 ]

3 голосов
/ 11 декабря 2011

В C ++ вы не можете комбинировать объявление и инициализацию. Когда вы не указываете параметры конструктора operator_list, вы не вызываете его конструктор по умолчанию: вы просто объявляете его. Вам также нужно инициализировать его в соответствующем файле C ++, например:

Equation.h

class Equation {
    static Dictionary operator_list;
};

Equation.cpp:

Dictionary Equation::operator_list(1);

Обратите внимание на отсутствие static в файле CPP: его там нет. Компилятор уже знает из объявления, что operator_list является статическим.

Edit: у вас есть выбор со статическими константными членами целочисленных и перечислимых типов: вы можете инициализировать их в файле CPP, как в примере выше, или вы можете дать им значение в заголовке. Вам все еще нужно определить этот элемент в вашем файле C ++, но вы не должны давать ему значение во время определения.

2 голосов
/ 11 декабря 2011
#include <iostream>
using namespace std;

class Dictionary
{
public:
    Dictionary() {}
    Dictionary(int i):page(i) {}
    void display() { cout << "page is " << page << endl; }
private:
    int page;
};

class Equation
{
    public:
    static Dictionary operator_list;

};

Dictionary Equation::operator_list(1); // static members must be initialized this way...

int main()
{
Equation::operator_list.display();
}

Вывод:

page is 1
2 голосов
/ 11 декабря 2011

static Dictionary operator_list(); - это сигнатура функции, объявляющая функцию, возвращающую Dictionary и не имеющую аргументов, поэтому ваш компилятор позволил вам это сделать.

Причины сбоя static Dictionary operator_list(1); заключаются в том, что вы не можетеустановите значение сложного типа в объявлении ваших классов.Вам нужно сделать это в другом месте (например, в .cpp)

Для получения дополнительной информации см. Этот пост: https://stackoverflow.com/a/3792427/103916

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...