2011-10-18 18 views
5

मैं क्यूटी का उपयोग कर रहा हूं लेकिन यह एक सामान्य सी ++ प्रश्न है। मेरा मामला सरल है, मेरे पास कक्षा 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(); 
} 

जब संकलन मुझे मिल गया:

QCoreAplication :: applicationFilePath: कृपया QAplication ऑब्जेक्ट को पहले

तो समस्या यहां स्पष्ट है। जब QAplication का स्थिर फ़ंक्शन Constants.cpp QAplplication में अभी तक Qt द्वारा स्थापित नहीं किया जाता है। मुझे QApplication a(argc, argv); लाइन तक किसी भी तरह इंतजार करने की ज़रूरत है, मुख्य.cpp

यह संभव है और यदि आप इसे दूर करने के लिए और क्या सुझाव नहीं दे सकते हैं?

धन्यवाद

+0

इसे निरंतर घोषित नहीं किया जा रहा है? यह निश्चित रूप से स्थिर नहीं है क्योंकि यह एप्लिकेशन स्टार्टअप पर कुछ राज्यों पर निर्भर करता है। – m0skit0

+0

लेकिन इसे केवल एक बार असाइन किए जाने के बाद इसे पढ़ने की आवश्यकता है? – destan

+2

मैं गलत हो सकता था, लेकिन 'QAplication :: applicationFilePath()। ToStdString()' मेरे लिए एक अस्थायी लग रहा है, इस स्थिति में आप अमान्य डेटा के लिए एक सूचक को संग्रहीत कर रहे हैं। –

उत्तर

7

एक विकल्प यह एक समारोह से वापस जाने के लिए, एक स्थिर चर में रखते हुए है। यह तब शुरू किया जाएगा जब फ़ंक्शन को पहली बार बुलाया जाता है।

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

+1। यह भी बेहतर है। – Nawaz

+0

हालांकि 2 उत्तरों एक ही परिणाम हैं और अच्छी तरह से काम करते हैं, आपका उत्तर अधिक सुरक्षित लगता है। धन्यवाद – destan

+0

एक स्थानीय सूचक वापस करने के लिए बुरा विचार। – ApproachingDarknessFish

11

ठेठ समाधान:

#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; 
} 
+0

+1। सरल और सही। – Nawaz

+3

क्या आप अस्थायी स्ट्रिंग की सामग्री में पॉइंटर संग्रहीत नहीं कर रहे हैं? या 'toStdString()' लगातार कुछ संदर्भ देता है? –

+0

@ नवाज: सी ++ 11 आईआईआरसी – sehe