首页 > 解决方案 > 为什么 c++ 使用 CustomClass** 而不是 CustomClass* 来创建返回 CustomClass 指针列表的函数?

问题描述

所以我正在学习 C++ 的基础知识,并且我有这个自定义类

class DataBook{
private:
    vector<PersonData> dataList;
    PersonData* numList[10];
    PersonData* nameList[10];
public:
PersonData** getNumList(){
    return this->numList;
    }

我只是不明白为什么我们使用PersonData**而不是PersonData*. 我知道这应该是PersonData**因为错误报告是这样说的。但我无法理解这个原因背后的逻辑。谢谢!

标签: c++

解决方案


当您传递(或返回)一个数组时,实际通过的是指向该数组第一个元素的指针。

而且,由于您有一个元素数组,指向PersonData*数组第一个元素的指针的类型为.PersonData**

这应该有望回答您的直接问题。


但是,我也想借此机会警告您,不要成为 C+ 程序员,那种似乎用 C++ 编写 C 代码的奇怪品种 :-)

尽管 C++ 最初是基于C 的,但人们常说(嗯,说得不少)最难教 C++ 的人是 C 开发人员。

如果有人想成为 C++ 开发人员,他们应该尝试完全接受 C++“思维模式”,包括考虑与您的代码相关的以下几点:

  • 如果您传递的指针总是指向一个实际的项目(而不是可能是NULL/ nullptr),那么您几乎肯定做错了。这就是创建引用的全部原因,我渴望将它们引入 C 的日子,即使只是在函数调用中进行传递引用。

  • 如果您将数据隐藏在类的私有部分后面,那么使用公共 API 将其暴露给任意修改可能是个坏主意。numList当我可以做的时候,您尝试的保护是相当无关紧要的auto x = obj.GetNumList(); x[0] = nullptr;。如果你必须这样做,你至少应该返回一个指针const来清楚地表明它不应该被修改。

  • std::vector您甚至应该考虑用或替换您的基本级别数组,std::array因为它们都提供了防止修改超出范围的元素的保护,并且还使用对象传递大小信息,这是您使用原始指针无法获得的。


推荐阅读