C ++ возможно ли отложить инициализацию постоянного статического члена? - PullRequest
5 голосов
/ 18 октября 2011

Я использую Qt, но это общий вопрос C ++. Мой случай прост, у меня есть класс Constants, который имеет постоянный статический член, который я хочу инициализировать после выполнения определенных вызовов функций.

Constants.h

#ifndef CONSTANTS_H
#define CONSTANTS_H

class Constants
{
public:

    static const char* const FILE_NAME;
};

#endif // CONSTANTS_H

Constants.cpp

#include "constants.h"
#include <QApplication>

const char* const Constants::FILE_NAME = QApplication::applicationFilePath().toStdString().c_str();

main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"
#include "constants.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    qDebug()<< "name: "<<Constants::FILE_NAME;
    //for those who are unfamiliar with Qt, qDebug just prints out
    return a.exec();
}

При компиляции я получил:

QCoreApplication :: applicationFilePath: Сначала создайте экземпляр объекта QApplication

Так что проблема здесь очевидна. Когда статическая функция QApplication вызывается в Constants.cpp, QApplication еще не установлен Qt. Мне нужно как-то подождать, пока строка QApplication a(argc, argv); не будет передана в main.cpp

возможно ли это, а если нет, что еще вы могли бы предложить, чтобы преодолеть это?

спасибо

Ответы [ 2 ]

11 голосов
/ 18 октября 2011

Типичное решение:

#ifndef CONSTANTS_H
#define CONSTANTS_H

class Constants
{
public:

    static const char* const getFILE_NAME();
};

#endif // CONSTANTS_H

А в кпп

#include "constants.h"
#include <QApplication>

const char* const Constants::getFILE_NAME()
{
    static const char* const s_FILE_NAME = QApplication::applicationFilePath().toStdString().c_str();

    return s_FILE_NAME;
}
7 голосов
/ 18 октября 2011

Один из вариантов - вернуть его из функции, сохранив его в статической переменной.Это будет инициализировано при первом вызове функции.

char const * const file_name()
{
    // Store the string, NOT the pointer to a temporary string's contents
    static std::string const file_name =
        QApplication::applicationFilePath().toStdString();
    return file_name.c_str();
}
...