关于设置空指针的困惑

时间:2016-08-11 23:40:38

标签: c++

我有一个类对象数组:

Course* courseList[100];

如果我想将CourseList设置为空指针,我该怎么做 courseList = nullptr; 但是我得到一个错误"表达式必须是可修改的值。

对于我的类ScmApp的构造函数

ScmApp::ScmApp() {
    noOfCourses = 0;
    courseList_[100] = {};
}

这是将courseList_的所有元素设置为nullptr的方法吗?

4 个答案:

答案 0 :(得分:3)

你唯一可以设置为nullptr的是指针。

CourseList不是指针。那就是问题所在。这就是为什么你不能将它设置为空指针。

CourseList是一个指针数组。相反,你可以做的是将CourseList中的每个指针都设置为空指针:

for (auto &p:CourseList)
    p=nullptr;

答案 1 :(得分:2)

您的CourseList是一组100个元素,而不仅仅是一个元素。因此,您需要迭代所有100并将每个元素指定为空指针。当Course* courseList[100] = {};完成此事时。

答案 2 :(得分:2)

Course * courseList[100] = {}; 

如果要在构造函数中初始化此数组,请使用

std::fill(courseList, courseList + 100, nullptr);

或使用std::array<Course *, 100> courseList;代替Course * courseList[100];

答案 3 :(得分:0)

CourseList* courseList[100]不会创建指向数组的指针,它会创建一个指针数组。根据您的实际需要,您应该使用以下之一

CourseList s

的数组
CourseList courseList[100];  // possibly with = {}
courseList[0].attr = whatever;  // usage

比上述更好,但相似,std::array CourseList

std::array<CourseList, 100> courseList;  // possibly with = {}
courseList[0].attr = whatever;

或者最接近你想要的,指向std::array CourseList的指针。这可能不是最好的,但是,它仍然是:

std::array<CourseList, 100>* courseList = nullptr;
courseList = new std::array<CourseList, 100>{};  // prefer unique_ptr
courseList->at(0).attr = whatever;

如果您在编译时不知道大小,或想要传递对象,最好的办法是使用std::vector

std::vector<CourseList> courseList(100);
courseList[0].attr = whatever;

最后,最奇怪的选择是实际定义一个指向数组的指针:

CourseList (*courseList)[100] = nullptr;

解决更新问题:您可以在类中使用默认初始值设定项,如下所示:

class ScmApp {
 private:
  CourseList* courseList[100] = {};
  int noOfCourses = 0;
};

但似乎您应该使用可扩展的容器std::vector并调用push_back来重复添加课程。我所看到的是一个非常难以维持的跟踪谁在哪个班级。

如果您必须使用现有数组并将所有内容设置为nullptr,那么您可以使用std::fill

std::fill(std::begin(courseList), std::end(courseList), nullptr);