表达式块类型有效 // 堆栈溢出

expression block type is valid // Stack overflow

尝试用 C++ 为我的大学构建一个项目。 尝试使用我在 Main.cpp 中为 MyDate 创建的方法 它一直让我堆栈 o/f 和 "expression block type is valid " 错误。

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;
}

非常感谢你们的帮助!!

您在 MyDate.h 中定义的函数 Date::setCmnt 仅将 Date::c 的第一个字符替换为输入字符串 cmnt 的第一个字符,而不是整个细绳。可能 Date::c 甚至没有初始化,所以你在这里覆盖了一些随机内存。

我强烈建议使用 std::string 来处理字符串。但是,您要指出的是,这是针对大学的,也许您还没有被介绍给 std::string,或者出于学术原因,您应该在这里与 char* 一起工作。因此,我将在这个答案中使用 char*

在您的 Date::setCmnt 函数中,您需要像在复制函数中那样复制字符串。此外,如果 Date::c 已经分配了一个值 (!=nullptr),您应该首先对其调用 delete[],这样您就不会造成内存泄漏。您还需要保证 Date::c 在 class.

的每个构造函数中正确初始化(例如 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;
};