C++ è possibile ritardare l'inizializzazione del membro statico costante?

C++ è possibile ritardare l'inizializzazione del membro statico costante?


Sto usando Qt ma questa è una domanda C++ generica. Il mio caso è semplice, ho una classe Constants che ha un membro statico costante che voglio che venga inizializzato dopo aver effettuato determinate chiamate di funzione.


Costanti.h


#ifndef CONSTANTS_H
#define CONSTANTS_H
class Constants
{
public:
static const char* const FILE_NAME;
};
#endif // CONSTANTS_H

Costanti.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();
}

Durante la compilazione ho ottenuto:



Quindi il problema qui è ovvio. Quando la funzione statica di QApplication viene chiamata in Constants.cpp QApplication non è ancora installato da Qt. Devo in qualche modo aspettare fino a QApplication a(argc, argv); la riga viene passata in main.cpp


è possibile e se no cos'altro potresti suggerire per superarlo?


grazie


Risposte:


Un'opzione è restituirlo da una funzione, mantenendolo in una variabile statica. Questo verrà inizializzato quando la funzione viene chiamata per la prima volta.


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();
}

Alcune risposte al codice


#ifndef CONSTANTS_H #define CONSTANTS_H  class Constants { public:
static const char* const FILE_NAME;
};
#endif // CONSTANTS_H
#include "constants.h" #include <QApplication>
const char* const Constants::FILE_NAME = QApplication::applicationFilePath().toStdString().c_str();
#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();
}
#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;
}
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();
}