2012-12-31 35 views
0

我只是寫一點OOP應用程序和運行時(不是編譯)上通過設置器類的私有變量的應用得到了崩潰,這裏的頭文件:代碼崩潰上設置類變量

class Car 
{ 
private: 
int year; 
std::string brand; 
std::string model; 
int price; 
std::string currency; 
public: 
int setYear(int x){this->year = x;} 
std::string setBrand(std::string x){this->brand = x;} 
std::string setModel(std::string x){this->model = x;} 
int setPrice(int x){this->price = x;}; 
std::string setCurrency(std::string x){this->currency = x;} 
}; 

和這裏的主: N - 對象的數量 溫度 - 傳遞整數 temp1中臨時變量 - 字符串傳遞

臨時變量
ifstream fd("input.in"); 
int n; 
fd >> n; 
int temp; 
string temp1; 
Car A[n]; 
for(int i = 0; i < 3; i++) 
{ 
    fd >> temp; 
    A[i].setYear(temp); 
    fd >> temp1; 
    A[i].setBrand(temp1); //Crashes Here 
    fd >> temp1; 
    A[i].setModel(temp1); 
    fd >> temp; 
    A[i].setPrice(temp); 
    fd >> temp1; 
    A[i].setCurrency(temp1); 
} 

後的小測試,我想通了,它然後崩潰代碼嘗試設置「品牌」變量。有什麼問題?

+0

'我<3'? 3從哪裏來? – JasonD

+0

請回顧一下數組和向量之間的區別,你打破了編碼中的一個基本規則。我首先會建議使用矢量,但是如果你堅持使用數組,那麼你將需要在這個實例中動態地分配內存。 –

回答

5

陣列尺寸必須在編譯時是已知的,所以:

C A[n]; 

是錯誤的。

GCC支持將可變長度數組作爲非標準擴展,但即使您意外使用它們,您的循環假定n == 3並沒有明顯的跡象表明這一定是正確的。

相反,使用矢量:

std::vector<C> A(n); 

,妥善遍歷它:

std::vector<C>::iterator it = A.begin(), end = A.end(); 
for (; it != end; ++it) { 
    // your for loop stuff with *it 
} 

,或者在C++ 11:

for (auto& a : A) { 
    // your for loop stuff with a 
} 
+0

因爲他在向量中設置東西,所以他需要for(auto&a:A)示例的ref。 –

+0

@Ryan:確實如此。順便說一句,我去過博爾德。好地方。 –

1

除了亮度的答案,我注意到你的Car類的方法有返回類型但沒有返回語句。運行時錯誤通常會掩蓋大多數編譯錯誤,所以這可能是爲什麼它沒有引起您的注意。要解決這個問題,請用void替換「set」方法的返回值,這意味着該函數不會返回任何內容。對所有方法都這樣做,因爲它們都缺少返回語句。

+0

閃電不在軌道上競賽!別傻了!儘管如此, –

+0

關於退貨的好處。 –

0

它不會給出任何編譯時錯誤?下面的語句應該會導致錯誤,因爲在編譯時n不知道。您應該將A作爲std :: vector或者將宏定義或靜態常量用於「n」。

Car A[n]; 

此外,你不需要設置函數的任何返回值。儘管函數簽名表明他們應該這樣做,但他們不返回任何內容。

+0

由於編譯標誌很鬆散,GCC將嘗試在某些情況下使用VLA。 –