Можно ли инициализировать член stati c в методе stati c класса в C ++? - PullRequest
1 голос
/ 06 августа 2020

Итак, у меня есть stati c member precision и метод publi c stati c для установки его значения в моем классе (код ниже сильно урезан).

class Foo {
private:
    typedef unsigned short precision_t;
    static precision_t precision;
public:
    static void set_precision(precision_t value) {
        precision_t precision = value;
        /* other stuff */
    }
    
    static precision_t get_precision() {
        return precision;
    }
};

Когда я создаю экземпляр, а затем устанавливаю значение, кажется, что он работает нормально, но попытка получить значение дает небольшую ошибку c: main.cpp:(.text._ZN3Foo13get_precisionEv[_ZN3Foo13get_precisionEv]+0x7): undefined reference to `Foo::precision' collect2: error: ld returned 1 exit status (запустить на onlinegdb.com).

Точный код в основном:

Foo *foo = new Foo(); //fine
foo->set_precision(5); //no error, but probably wrong given undefined reference
std::cout << Foo::get_precision(); //shows above error

Мой исходный код для set_precision больше походил на

static void set_precision(precision_t value) {
    static bool defined = false;
    if (defined) {
        precision = value
    } else {
        precision_t precision = value;
        defined = true;
    }
    /* other stuff */
}

, поэтому он инициализирует precision только в первый раз.

Я также попытался сделать это для вектора, который хранит указатели на все экземпляры, вместо того, чтобы писать код для инициализации вне класса / в файле .cpp.

Это даже возможно это сделать, или мне нужно инициализировать (вектор, хранящий указатели экземпляров и беззнаковый короткий, хранящий текущую точность) в файле .cpp перед функцией main?

1 Ответ

1 голос
/ 06 августа 2020

Обновленный код:

#include <iostream>
using namespace std;

class Foo {
private:
    typedef unsigned short precision_t;
    static inline precision_t precision; 
    //static precision_t precision; //when not using static inline
public:
    static void set_precision(precision_t value) {
        //precision_t precision = value; //<<-- error in your code
        precision = value; 
        /* other stuff */
    }
    
    static precision_t get_precision() {
        return precision;
    }
};

//Foo::precision_t Foo::precision = 0; //when not using static inline

int main() {
    Foo *foo = new Foo(); //fine
    foo->set_precision(5); //no error, but probably wrong given undefined reference
    std::cout << Foo::get_precision(); //shows above error
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...