Статические переменные, используемые в качестве констант, возвращают ноль в другом классе - PullRequest
1 голос
/ 01 октября 2011

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

Они не помечены как const, потому что я использую графический интерфейс для настройки их во время выполнения. Когда я регистрирую их в главном классе (который вызывает статическую функцию init в классе Defaults) - они действительны. Но в конструкторе другого класса он возвращает ноль.

Вывод выглядит так

"Constants::init() called" // Constants::Heads::MIN_LIFETIME initialized to 1200
preSetup-Log  Constants::Heads::MIN_LIFETIME 1200
PhysicsObject- Constants::Heads::MIN_LIFETIME 0 // Y you zero?
postSetup-Log  Constants::Heads::MIN_LIFETIME 1200

Я определяю константы следующим образом:

namespace Constants {
    namespace Forces {
        static int MAX_LIFETIME;
        static float GRAVITY_FORCE;
    };
}


static void init() {
    std::cout << "Constants::init()" << std::endl;
    Constants::Forces::GRAVITY_FORCE = 40000.0f;
    Constants::Forces::MAX_LIFETIME = 3000;
}

Ответы [ 2 ]

4 голосов
/ 01 октября 2011

Это потому, что когда вы объявляете переменную static внутри (скажем .h) файла и включаете этот файл в различные .cpp файлы, то для каждого файла .cpp (единицы перевода) создается отдельная копия переменной создается . Например,

// x.h ...
    namespace Forces {
        static int MAX_LIFETIME;  // unique copy for each translation unit (.cpp)
        static float GRAVITY_FORCE;  // same as above

        extern int SOMETHING; //<----- creates only single copy 
    };

Как показано, вы должны создать переменную как extern внутри namespace и определить эту переменную только в одном из .cpp файлов.

Другой способ заключается в том, чтобы заключить их в class вместо namespace:

class Forces {
    static int MAX_LIFETIME;  // only 1 copy
    static float GRAVITY_FORCE;  // only 1 copy
};

Вы все равно должны определить их в одном из .cpp файлов как,

int Forces::MAX_LIFETIME = <>;
3 голосов
/ 01 октября 2011
// header.h
namespace Constants {
    namespace Forces {
    extern int MAX_LIFETIME;
    extern float GRAVITY_FORCE;
    }
}

// my_constants.cpp
namespace Constants {
    namespace Forces {
        int MAX_LIFETIME = 3000;
        float GRAVITY_FORCE = 40000.0f;
     }
}

Затем включите header.h в файл, который использует константы.Константы будут инициализированы автоматически при запуске программы.

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