2015-10-25 62 views
-1

好的,我已經閱讀並且似乎無法找到與我的問題相匹配的答案。 This是我能找到的最接近的。C++:是否有可能/建議基於運行時條件聲明變量?

我的情況是:我有三組變量,程序執行A組並根據用戶指定的標誌設置B或設置C.所有組的值也是用戶定義的。目前,我有這樣的事情:

#include <iostream> 
#include <string> 
#include <cmath> 

int main() 
{ 
    //Set A 
    double a,b,c; 
    bool flag; 

    std::cout << "Set Flag" << '\n'; 
    std::cin >> flag; 

    if(flag) 
    { 
     //Set B 
     double x1,x2,y1,y2,z; 
     std::cout << "Set Variable X1." << '\n'; 
     std::cin >> x1; 

     std::cout << "Set Variable X2." << '\n'; 
     std::cin >> x2; 

     std::cout << "Set Variable Y1." << '\n'; 
     std::cin >> y1; 

     std::cout << "Set Variable Y2." << '\n'; 
     std::cin >> y2; 

     std::cout << "Set Parameter Z." << '\n'; 
     std::cin >> z; 

     //Some operations based on set B 
     a = x+y; 

    } 
    else 
    { 
     //Set C 
     double t,u,v; 
     std::cout << "Set Variable T." << '\n'; 
     std::cin >> t; 

     std::cout << "Set Variable U." << '\n'; 
     std::cin >> u; 

     std::cout << "Set Parameter V." << '\n'; 
     std::cin >> v; 

     //Some operations based on set C 
     a = t+u; 

    } 

    // I want to do more operations common to both sets here using data from selected set... 
    // Write to file, etc. 
} 

哪種方式會更好:申報所有可能的變量第一,或者完全用叉子叉的代碼使的if/else代碼完成,作爲標誌改變幾個關鍵的內雖然我想要做的很多事情都是類似的。

條件之間的主要區別是,如果標誌爲true,程序將使用一些數組/向量,而如果標誌爲false,則使用單個值。

+0

您是否在問性能,可讀性,可維護性或其他組合?如果您在代碼中使用UI,任何性能差異都如此微不足道,應該忽略。可讀性和可維護性通常通過延遲變量聲明直到需要並提供該值爲佳。但是合併路徑之間的任何真正的通用性也會提高可讀性和可維護性。 – JSF

+0

你應該選擇一種語言。 – juanchopanza

+0

你似乎正在描述一種情況,在這種情況下,推遲「a」的聲明直到它的第一個分配值準備就緒是不切實際的。我從來沒有對這些情況感到激動。但是你需要滿足問題的要求。但是你似乎正在考慮走向另一個極端,並且早就毫無意義地放下'x'等的聲明。我認爲這是一個壞主意。 – JSF

回答

-1

如何使用聯合。你互補的數據集需要有相同的大小,或者你必須注意緩衝區溢出...

struct setB{ 
    double x,y,z; 
} 
struct setC{ 
    double u,t,v; 
} 
union{ 
    setB set1; 
    setC set2; 
} common_field; 
+1

**爲什麼**你認爲通過這個答案完成了什麼。你迫使一個可疑的實現細節,編譯器會做得比它自己選擇的更好,並且你無意中模糊了算法! – JSF

+0

這有什麼用? – dtech

+0

我覺得這個問題的一部分是關於不重複代碼。這可能比C++更C,但如果數據集B和C是獨佔的,那麼爲什麼不使用相同的內存區域。爲了可讀性,我不會在公共塊中引用B或C集,但會引入一些不透明的數組... –

0

是什麼讓你覺得這是不可能或不建議?

回到過去的C日,你必須事先聲明所有的變量,但這不再必要。當你需要它們時,你可以自由地聲明變量,以及你需要它們的地方。它更容易,更靈活,而且更具可讀性,因爲它符合意圖流動。

基於運行時值,程序可能會採取不同的方向,並做不同的事情,這需要不同的變量。如果所有代碼路徑都可以使用一組變量,則可以預先聲明並在任何情況下使用它們。

0

首先,在C++中聲明變量的範圍儘可能狹窄是很好的做法。所以你的示例代碼確實是正確的。爲了便於閱讀,我將一些代碼放入函數中:

#include <iostream> 
#include <string> 
#include <cmath> 

double inputDouble(const std::string& question) { 
    std::cout << question << std::endl; 
    double r; 
    std::cin >> r; 
    return r; 
} 

double handleB() { 
    //Set B 
    double x = inputDouble("Set Variable X."); 
    doubly y = inputDouble("Set Variable Y."); 
    double z = inputDouble("Set Parameter Z."); 

    //Some operations based on set B 
    return x+y;  
} 

double handleC() { 
     //Set C 
     double t = inputDouble("Set Variable T."); 
     double u = inputDouble("Set Variable U."); 
     double v = inputDouble("Set Parameter V."); 

     //Some operations based on set C 
     a = t+u;  
} 

int main() { 
    //Set A 
    bool flag; 

    std::cout << "Set Flag" << '\n'; 
    std::cin >> flag; 

    double a = (flag) ? handleB() : handleC(); 

    // whatever you plan with a 
} 

當然你的函數也可以返回更復雜的對象。

+0

我認爲這正開始接近我正在嘗試做...可能能夠改變它,使其調用某些功能基於國旗 但我想我仍然會遇到重複的代碼問題,因爲最大的變化是在一種情況下具有更多變量(移動目標的最大值,最小值等)和矢量/陣列,而另一種情況下靜止目標的變量較少。 – Zalastra