2015-04-12 59 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