【发布时间】:2016-07-26 22:51:29
【问题描述】:
我需要检查我的对象Course 是否处于安全的空状态。
这是我失败的尝试:
const bool Course::isEmpty() const {
if (Course() == nullptr) {
return true;
}
else {
return false;
}
}
构造函数:
Course::Course() {
courseTitle_ = new char[21]; // name
courseTitle_ = '\0';
credits_ = 0;//qtyNeeded
studyLoad_ = 0;//quantity
strcpy(courseCode_, "");//sku
}
Course::Course(const char* courseCode, const char* courseTitle, int credits , int studyLoad ) {
strcpy(courseCode_, courseCode);
courseTitle_ = new char[21];
strcpy(courseTitle_, courseTitle);
studyLoad_ = studyLoad;
credits_ = credits;
}
显然,执行 course() == nullptr 并不能真正检查对象是否处于安全的空状态,如果单个变量设置为 0,则检查它们在我的程序中也不起作用。我需要检查整个对象是否设置为安全的空状态。
编辑:你们中的一些人在问我的 empty() 函数应该使用什么。有一个测试器可以测试我的 isEmpty() 是否正常工作。
bool isEmptyTest0() {
// empty test
sict::Course c0;
return c0.isEmpty();
}
bool isEmptyTest1() {
// empty test
sict::Course c0("", "title", 3, 3);
return c0.isEmpty();
}
bool isEmptyTest2() {
// empty test
sict::Course c0("code", "", 3, 3);
return c0.isEmpty();
}
bool isEmptyTest3() {
// empty test
sict::Course c0("code", "title", -1, 3);
return c0.isEmpty();
}
bool isEmptyTest4() {
// empty test
sict::Course c0("code", "title", 3, -1);
return c0.isEmpty();
}
bool regularInitTest() {
// regular
sict::Course c5("OOP244", "Object-Oriented Programming in C++", 1, 4);
return (!c5.isEmpty()
&& !strcmp("OOP244", c5.getCourseCode())
&& !strcmp("Object-Oriented Programming in C++", c5.getCourseTitle())
&& (c5.getCredits() == 1)
&& c5.getStudyLoad() == 4
);
}
请注意,在regularInitTest() 中,我的赋值运算符工作正常,但它永远不会通过!c5.isEmpty(),因为它失败了。希望我解释正确。
【问题讨论】:
-
定义“安全空状态”
-
我猜
if (Course() == nullptr)中的括号有问题。您构造一个空的 Course 对象,然后再次测试 nullptr。我不太确定你打算做什么,但可能不是这个。 -
courseTitle_ = '\0';应该是courseTitle_[0] = '\0';。您正在用 char 文字的地址覆盖newchar 数组的地址。这充其量会导致内存泄漏,然后可能会导致分段错误。 -
@andirew1990 C++ 不是 Java、C 或 JavaScript。您还不了解 C++ 中的事情是如何完成的。造成这种情况的主要原因之一是“在线教科书”很糟糕。你不想解决自己的问题。相反,您想退后一步,正确地学习 C++。
-
对我来说,
isEmpty似乎应该测试有效状态。前四个测试每个都传递一个无效值作为构造函数参数之一,并期望一个“坏/空”的课程对象。