解析未知类

时间:2018-02-19 12:16:47

标签: c++

我正在对我的想法进行一些测试。但是,我很茫然。 我已经宣布了一个类:

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

喜欢这样..

2 个答案:

答案 0 :(得分:0)

在我回答之前,请注意。你说:&#34;我已经为所有10个人分配了内存。&#34;这是不好的。您在name上浪费了永远无法使用的空间。相反,让我们根据需要使用string进行分配,并根据需要分配任意数量的字符。

现在,您需要使用optional来解决此问题。具体而言,您的name不应被定义为char* name,而是optional<string> name。要使用optional,您只需更改printCourses方法:

void Course::printCourses() const { cout << name.value_or(""); }

Live Example

答案 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 ++字符串来做同样的事情。