2015-04-12 58 views
-2

試圖在C++中建立一個項目對於我的大學。 試圖使用我爲MyDate創建的方法在我的Main.cpp中 ,它不斷讓我堆棧o/f和「表達塊類型是有效的」錯誤。表達式塊類型是有效的//堆棧溢出

main.cpp中:

date1.setDay(8); 
date1.setMonth(4); 
date1.setYear(1994); 
date1.setCmnt("Bday");  //problem with chars and pointers.. 
date1.print(); 
//Copy Constructor 
date2 = date1; 
date2.print(); 

MyDate.h:

void setCmnt(char *cmnt){ 
    if (cmnt!=nullptr) 
     *c = *cmnt; 
}; 

拷貝常數:

day=Date.day; 
month=Date.month; 
year=Date.year; 
if (Date.c != nullptr) 
{ 
    c = new char[strlen(Date.c) + 1]; 
    strcpy(c, Date.c); 
    //*c = *Date.c; 
} 

TNX很多的幫助傢伙!

回答

0

您在MyDate.h中定義的函數Date::setCmnt僅將第一個字符Date::c替換爲輸入字符串cmnt的第一個字符,而不是整個字符串。可能Date::c甚至沒有初始化,所以你在這裏覆蓋一些隨機存儲器。

我強烈建議使用std::string來處理字符串。然而,你指出,這是爲了大學,也許你還沒有被介紹到std::string還是因爲學術原因,你應該在這裏與char*一起工作。因此,我將與char*在此答案:

在您的Date::setCmnt函數中,您需要複製字符串,就像您在複製c'tor中一樣。另外,如果Date::c已分配一個值(!=nullptr),則應首先調用delete[],以免造成內存泄漏。您還需要保證Date::c已在您班級的每個構造函數中正確初始化(例如至nullptr)。

例如: - 所有的

void setCmnt(char *cmnt){ 
    if (c!=nullptr) 
     delete[] c; 
    if (cmnt!=nullptr){ 
     c = new char[strlen(cmnt) + 1]; 
     strcpy(c, cmnt); 
    } 
    else c = nullptr; 
}; 
+0

首先,我不得不說一個巨大的謝謝你幫我我的代碼, 第二 - 是的,我知道的字符串,但我必須使用的char *。 也 - 真的很棒的改進,我從中學到了很多!謝謝! 最後 - 我的錯誤仍然buggin我:( 圖片; http://tinypic.com/r/2n87czr/8 – unix14

+0

這可能意味着,你刪除一個指針已被刪除。還要確保你!不存儲指針/引用任何臨時對象 –

+0

你是對的 我去我的析構函數,那就是問題, {(!C = nullptr)\t如果刪除[℃;} 我應該怎麼辦修復它? – unix14