解析未知类别的数据

Parsing Data from Unknown Class

本文关键字:数据 未知      更新时间:2023-10-16

我正在对自己的想法进行一些测试。但是,我不知所措。我已经宣布了一个课程:

class Course {
  private:
    char *name;
    int ID;
  public:
    void printCourses();
}

其中printCourses()定义为

void Course::printCourses() {
    cout << name;
}

这很有意义。每个类都有一个称为name的数据成员。因此,说我已经宣布了10个类对象的数组,这意味着10个潜在名称将与一门课程相对应...好吧。

我的问题在这里。

如果对象6和9在运行时的某个时候填充了这些值,我想知道这一点。例如,假设课程6的名字是"心理学",而课程9的名字是"历史"。我希望能够在某种"课程列表"函数中打印这些值...在这里尚未填写某些类对象,但我希望能够解析并找到确实填充名称变量的对象。

我尝试了一个用于测试此循环的循环,但没有逻辑有所帮助...我尝试了。

for (int i=0; i<10; i++) {
    course[i]->printCourses();
}

在我的脑海中,这仍然应该迭代所有10个对象(我已经为其中10个分配了内存(,但事实并非如此。但是,如果我只称我知道的那个填充是这样的:

course[6]->printCourses();

它返回正确的"心理学"。

tldr:帮助,如何通过类对象迭代以找到填充的某些变量?

免责声明我正在使用 ->运算符上的类,因为我将数组声明为类对象的指针数组。

Course *course[10];

喜欢..

在我回答之前,请注意。您说:"我已经为所有10个分配了记忆。"这不好。您浪费了name S上永远不会使用的空间。相反,让我们使用string根据需要分配,并根据需要分配任何数量的字符。

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

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

实时示例

您可以做出返回名称的附加方法。如果名称是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 字符串进行几乎相同的操作。