我正在对我的想法进行一些测试。但是,我很茫然。 我已经宣布了一个类:
class Course {
private:
char *name;
int ID;
public:
void printCourses();
}
printCourses()
定义为
void Course::printCourses() {
cout << name;
}
这是有道理的。每个类都有一个名为name
的数据成员。所以,假设我已经声明了一个包含10个类对象的数组,这意味着10个潜在的名称将对应于一个课程......好的。
我的问题在于此。
如果对象6和9在运行时的某个时刻填充了这些值,我想知道这一点。例如,说课程6的名字是“心理学”,课程9的名字是“历史”。我希望能够在一个“课程列表”功能中打印这些值...这里还没有填充一些类对象,但我希望能够解析并找到填充了名称变量的对象。
我已经尝试过for循环来测试这个,但没有逻辑帮助......我试过了。
for (int i=0; i<10; i++) {
course[i]->printCourses();
}
在我的脑海中,这应该仍然遍历所有10个对象(我已经为所有10个对象分配了内存),但它没有。但是,如果我只是打电话给我知道的那个就像这样填充:
course[6]->printCourses();
它正确回归“心理学”。
TLDR:帮助,如何遍历类对象以查找已填充的某些变量?
声明 我正在使用 - &gt;类的运算符,因为我将数组声明为类对象的指针数组。
Course *course[10];
喜欢这样..
答案 0 :(得分:0)
在我回答之前,请注意。你说:&#34;我已经为所有10个人分配了内存。&#34;这是不好的。您在name
上浪费了永远无法使用的空间。相反,让我们根据需要使用string
进行分配,并根据需要分配任意数量的字符。
现在,您需要使用optional
来解决此问题。具体而言,您的name
不应被定义为char* name
,而是optional<string> name
。要使用optional
,您只需更改printCourses
方法:
void Course::printCourses() const { cout << name.value_or(""); }
答案 1 :(得分:-1)
您可以创建一个返回名称的附加方法。如果名称是nullptr
,则忽略它。您的方法可能如下所示:
char* Course::GetName()
{
return name;
}
然后你用:
进行迭代for (int i = 0; i < 10; i++) {
if (course[i]->GetName())
course[i]->printCourses();
}
另一种方法是组合功能:
void Course::printCourses() {
if (name)
std::cout << name;
}
使用以下内容进行迭代,只会在名称存在时打印出来:
for (int i = 0; i < 10; i++) {
course[i]->printCourses();
}
最好在构造函数中初始化名称:
Course::Course() : name(nullptr), ID (0) {}
小方注意:使用std::string
代替char*
。我为你的案例提供了一个解决方案,但你可以使用一个可靠的c ++字符串来做同样的事情。