C++ 解析未知类中的数据

C++ 解析未知类中的数据,c++,C++,我正在测试我的一个想法。然而,我不知所措。 我已经声明了一个类: class Course { private: char *name; int ID; public: void printCourses(); } 其中printCourses()定义为 void Course::printCourses() { cout << name; } 在我看来,这仍然应该遍历所有10个对象(我已经为所有10个对象分配了内存),但事实并非如此。但是

我正在测试我的一个想法。然而,我不知所措。 我已经声明了一个类:

class Course {
  private:
    char *name;
    int ID;
  public:
    void printCourses();
}
其中
printCourses()
定义为

void Course::printCourses() {
    cout << name;
}
在我看来,这仍然应该遍历所有10个对象(我已经为所有10个对象分配了内存),但事实并非如此。但是,如果我只调用我知道的一个,它是这样填充的:

course[6]->printCourses();
它正确地返回“心理学”

TLDR:帮助,我如何遍历类对象来查找某些已填充的变量

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

Course *course[10];

像这样..

您可以创建一个额外的方法来返回您的名称。如果名称是
nullptr
,则忽略它。您的方法可能如下所示:

char* Course::GetName()
{
    return name;
}
然后使用以下方法进行迭代:

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

小旁注:使用
std::string
代替
char*
。我为你提供了一个解决方案,但是你可以用一个实心C++字符串做同样的事情。你说:“我已经为所有10个分配了内存。”这很糟糕。您在永远不会使用的
name
s上浪费了空间。相反,让我们使用
字符串
根据需要进行分配,并根据需要分配任意数量的字符

现在,您需要使用来解决这个问题。具体来说,您的
名称
不应定义为
char*name
,而应定义为
可选名称
。要使用
可选
您只需更改
打印课程
方法:

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

void课程::printcources()常量{cout如果成员是可选的,您可以查看
std::optional
首先我建议使用
std::string
而不是
char*
,其次,您是否刷新了
cout
,例如使用std::endl?可能缓冲区还没有打印出来……单词很重要:必须区分类和对象(类实例)顺便说一句,你的标题似乎有点不对劲。你的代码中没有“未知类”。如果Course类型的对象在创建后被允许设置名称(名称在构造函数中没有作为参数提供),那么你的对象还应该提供一个方法,该方法会向调用方提示名称是否有效(或设置).Ouch!1.
GetName
应返回
std::string
.2.构造函数应使用初始值设定项列表(
Course::Course():name(nullptr),ID(0){}
一个只返回成员的getter,客户端需要检查null ptr?这是封装出了问题:PThanks用于反馈。我使用了你的构造函数并在
printCourses
方法中检查了名称。我继续使用
char*
,因为OP想要一个带有
char*
的解决方案。
void Course::printCourses() {
    if (name)
        std::cout << name;
}
for (int i = 0; i < 10; i++) {
    course[i]->printCourses();
}
Course::Course() : name(nullptr), ID (0) {}
void Course::printCourses() const { cout << name.value_or(""); }