2013-01-03 14 views
6

मेरे पास एक स्थिर मूल्य है जो रन-टाइम के दौरान कभी नहीं बदलता है, लेकिन रन-टाइम तक जानना असंभव है।सी ++ रन-टाइम पर एक कॉन्स वैल्यू असाइन करें?

क्या इसे परिभाषित किए बिना निरंतर घोषित करने का कोई तरीका है (या तो कक्षा के सदस्य के रूप में या नहीं) और एक बार गणना की गई मान (और केवल एक बार) निर्धारित की जाती है; या क्या मुझे एक गैर-कॉन्स घोषणा का सहारा लेना होगा और कोडिंगPs (ALL_CAPS चर नाम, static कक्षा में इत्यादि) की घोषणा करने के लिए उपयोग करना होगा) को आजमाएं और इसे बदलने से रोकें?

स्पष्टीकरण:

इन अच्छा जवाब हैं हालांकि, वास्तविक दुनिया स्थिति मैं अधिक जटिल है:

कार्यक्रम एक मुख्य पाश है जो लगातार प्रसंस्करण और प्रतिपादन के बीच चलती है है; उपयोगकर्ता आवश्यक विकल्प सेट कर सकता है और एक बार सेट होने के बाद वे प्रोग्राम को पुनरारंभ होने तक कभी नहीं बदलेंगे। मुख्य लूप से पहले निर्धारित किए जा सकने वाले किसी भी चीज़ के लिए "प्रारंभ करें" फ़ंक्शन सेट किया गया है, लेकिन प्रोसेसिंग चरण के दौरान उपयोगकर्ता इंटरैक्शन पर निर्भर मानों को लूप के बीच में किया जाना चाहिए। (फिलहाल, लगातार डेटा स्टोरेज तकनीकें दिमाग में आती हैं ...)

+1

स्पष्टीकरण के संबंध में। ऐसा लगता है कि आपके पास लूप है, और कुछ चरम पर कुछ चर (ओं) को "बनने" के लिए चाहते हैं। यह व्यवहार्य नहीं है; एक चर या तो कॉन्स्ट है, या यह नहीं है। –

उत्तर

7

ऐसा कुछ?

const int x = calcConstant(); 

यदि यह एक वर्ग के सदस्य है, तो, निर्माता initialisation सूची का उपयोग Yuushi के जवाब में के रूप में।

6

आप एक struct या class में यह परिभाषित करने और एक initialisation सूची का उपयोग कर सकते हैं:

#include <iostream> 

struct has_const_member 
{ 
    const int x; 

    has_const_member(int x_) 
     : x(x_) 
    { } 

}; 

int main() 
{ 
    int foo = 0; 
    std::cin >> foo; 
    has_const_member h(foo); 
    std::cout << h.x << "\n"; 
    return 0; 
} 
4

एक स्थिर या समारोह-स्थानीय चर के रूप में:

const int x = calcConstant(); 

एक वर्ग के सदस्य के रूप में:

struct ConstContainer { 
    ConstContainer(int x) : x(x) {} 
    const int x; 
}; 
1

हां, आप प्रारंभिक के साथ एक निजी स्थिर सिंगलटन क्षेत्र बना सकते हैं जेशन विधि और एक गेटोर विधि। यहाँ यह कैसे करना है की एक उदाहरण है:

// In foo.h 
class Foo 
{ 
public: 
    // Caller must ensure that initializeGlobalValue 
    // was already called. 
    static int getGlobalValue() { 
     if (!initialized) { 
      ... handle the error ... 
     } 
     return global_value; 
    } 

    static void initializeGlobalValue(...) 

private: 
    static bool initialized; 
    static int global_value; 
}; 

// In foo.cpp 
bool Foo::initialized = false; 
int Foo::global_value; 

void Foo::initializeGlobalValue(...) { 
    if (initialized) { 
     ...handle the error... 
    } 
    global_value = ...; 
    initialized = true; 
} 
0

तरह से मैं इस सवाल का जवाब स्ट्रिंग में प्रत्येक चरित्र की संख्या की गणना, और झूठे वापस जाने के लिए था के बाद कुछ चरित्र की संख्या अक्षरों की सीमा है, जो होगा से अधिक है हो (str.size() + 1)/2। यदि कोई वर्ण गणना इस सीमा से अधिक नहीं है, तो सत्य वापस आएं।

bool canShuffle(string str) { 
    int maxCharCount = (str.size()+1)/2; 
    int charCount[256] = {0}; 

    for(char c : str) { 
     if(++charCount[c] >= maxCharCount) 
      return false; 
    } 
    return true; 
} 
+3

मुझे लगता है कि आपने एक ऐसे प्रश्न का उत्तर दिया जिसे आपने नहीं सोचा था कि आप जवाब दे रहे थे। गलत खिड़की सिंड्रोम शायद? – Casey

संबंधित मुद्दे