C++ 关于设置空指针的困惑

C++ 关于设置空指针的困惑,c++,C++,我有一个类对象数组: Course* courseList[100]; 如果我想将CourseList设置为空指针,我会这样做吗 courseList=nullptr; 但“表达式必须是可修改的值”有一个错误 对于我的类ScmApp的构造函数 ScmApp::ScmApp() { noOfCourses = 0; courseList_[100] = {}; } 这是将courseList的所有元素设置为nullptr的方法吗?您的courseList是一组100个元素,而不

我有一个类对象数组:

Course* courseList[100];

如果我想将CourseList设置为空指针,我会这样做吗 courseList=nullptr; 但“表达式必须是可修改的值”有一个错误

对于我的类ScmApp的构造函数

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

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

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

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

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

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

for (auto &p:CourseList)
    p=nullptr;
如果要在构造函数中初始化此数组,请使用

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

或者使用
std::array courseList;
而不是
Course*courseList[100];
courseList*courseList[100]
不创建指向数组的指针,而是创建一个指针数组。根据您实际需要,您应该使用以下选项之一

CourseList
s的数组

CourseList courseList[100];  // possibly with = {}
courseList[0].attr = whatever;  // usage
std::array<CourseList, 100> courseList;  // possibly with = {}
courseList[0].attr = whatever;
比上述更好,但类似的是
std::array
of
CourseList
s

CourseList courseList[100];  // possibly with = {}
courseList[0].attr = whatever;  // usage
std::array<CourseList, 100> courseList;  // possibly with = {}
courseList[0].attr = whatever;
如果您在编译时不知道对象的大小,或者希望传递对象,那么最好使用
std::vector

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

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

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

不,您需要循环整个容器并将每个元素指定为空指针。当这个
Course*courseList(100,null);
执行相同的操作时。“如果我想将courseList设置为空指针“
CourseList
不是指针,而是指针数组。是否要将每个元素设置为
nullptr
courseList
是一个数组。不能将数组设置为null,就像不能将CAT或洗碗机设置为null一样。只有指针可以为空。@KerrekSB,为什么
Course*courseList[100]={nullptr}做这项工作?你没有一个“类对象”数组,你有一个指针数组
确实无法编译。
courseList
不是一个容器,它是一个数组,这就是为什么没有一个构造函数接受两个参数。我刚刚检查了它,你们说得对。我的坏消息@molbdnilothanks@Andy完成了,但是你应该认真地重新思考你的方法。@Andy你的问题有几个正确的答案。现在你试过了吗??
std::fill(std::begin(courseList), std::end(courseList), nullptr);