2014-03-03 46 views
-4

我正在使用其他人爲計算化學反應而編寫的代碼。用戶必須爲計算指定很多值,這可能會導致錯誤。我試圖自動化/簡單地這個過程。爲什麼我不能通過執行「myVector [i] .data()」來實例化一個類,其中myVector [i] .data()是一個字符串?

我可以通過執行(例如)實例化一個類:

Algorithm<double> chlorine; 

我想這樣做多個實例 - 例如,氯,氫和氧。我不明白爲什麼我得到一個分段錯誤,當我把「氯」,「氫」和「氧」作爲字符串稱爲向量元素「chemicalElements」,然後執行:

for (i = 0; i < chemicalElements.size(); i++) 
{ 
    Algorithm<double> chemicalElements[i].data(); 
} 

上午我在這裏錯過簡單的東西?當我寫:

Algorithm<double> chlorine; 

「氯」只是一個字符串,對不對?那麼爲什麼它不能在一個字符串矢量中添加「氯」元素?

+2

請在C++上獲得一本教科書,並從簡單的事情開始。如果有更好更合適的資源用於學習,那麼在Stack OVerflow上詢問一門語言的基礎知識是沒有意義的。 –

+0

我過去兩個星期試圖弄清楚這一點。我不常使用C++,因爲我是化學家。如果它非常簡單,那麼指出正確的方向會很棒。 – user616199

+1

如果'chemicalElements [i] .data();'是一個字符串,那麼你就不能使用該字符串的內容作爲變量的名稱(在你的例子中,「chlorine」不是一個字符串,而是一個對象的名字類型'算法')。 – sleepy42

回答

3

chlorine不是您的示例代碼中的字符串,它是變量的標識符(類型爲Algorithm<double>)。

必須給出變量編譯時間標識符;這意味着編譯器遍歷代碼時必須指定標識符。 chemicalElements[i].data()的結果是未知的,直到運行時間

C++沒有任何在運行時創建變量名稱的功能,所以你不能直接詢問。但是,這聽起來像你真正需要的是一個算法對象的集合,每個元素都有一個。要創建算法對象的數組,你可以這樣做:

Algorithm<double> algorithms[15]; 

這將創建15個不同的算法對象,這樣你可以映射到元素,只要你喜歡。你當然可以選擇一個不同於15的數字,只要這個數字是編譯時常量。

您可能也有興趣瞭解std::vector<T>,這是一種允許您創建動態調整大小數組的類型,或std::map<K,V>,它允許您創建鍵值(字符串,如「氯」)之間的關聯映射和一個值,如相關的算法)。

要使用後者,你可以做這樣的事情:

std::map<std::string, Algorithm<double>> algorithms; 
algorithms["chlorine"] = Algorithm<double>(); 
algorithms["argon"] = Algorithm<double>(); 

再後來:

auto results = algorithms["chlorine"].data(); 

(你當然應該仔細閱讀上述類型的鏈接文檔,因爲我爲簡潔起見,省略了一些錯誤處理。)

+0

非常感謝您的耐心等待。你對編譯和運行時的解釋確實有助於我理解正在發生的事情。 – user616199

1

算法氯,意味着 你實例化一個名爲「氯」

使「算法」的陣列 您編寫的「算法」對象時,它想:

Algorithm<double> chemicalElements[Const_num]; 

,並通過通過項目的每一個你調用數組的名字+是指數,如:

chemicalElements[0 or 1 or 2 or ... etc].data(); 

所以它會像

for (i = 0; i < Const_num i++) 
{ 
    chemicalElements[i].data(); 
} 
1

在這份聲明中

Algorithm<double> chlorine; 

氯是不是一個字符串。它是一個識別符,用於命名Algorithm<double>類型的對象。

這種結構

Algorithm<double> chemicalElements[i].data(); 

在C++沒有意義句式和編譯器將發出錯誤。

相關問題