5

Qt を使用していますが、これは一般的な C++ の質問です。私の場合は単純Constantsです。特定の関数呼び出しが行われた後に初期化する定数静的メンバーを持つクラスがあります。

定数.h

#ifndef CONSTANTS_H
#define CONSTANTS_H

class Constants
{
public:

    static const char* const FILE_NAME;
};

#endif // CONSTANTS_H

定数.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で行が渡されるまで何とか待つ必要があります

それは可能ですか?そうでない場合、これを克服するために他に何を提案できますか?

ありがとう

4

2 に答える 2

11

典型的な解決策:

#ifndef CONSTANTS_H
#define CONSTANTS_H

class Constants
{
public:

    static const char* const getFILE_NAME();
};

#endif // CONSTANTS_H

そしてcppで

#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;
}
于 2011-10-18T11:41:58.340 に答える
8

1 つのオプションは、静的変数に保持して、関数から返すことです。これは、関数が最初に呼び出されたときに初期化されます。

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();
}
于 2011-10-18T11:45:47.937 に答える