所以我正在学习c ++的基础知识,我有这个自定义类
class DataBook{
private:
vector<PersonData> dataList;
PersonData* numList[10];
PersonData* nameList[10];
public:
PersonData** getNumList(){
return this->numList;
}
我无法理解为什么我们使用PersonData**
代替PersonData*
。
我知道它应该是PersonData**
,因为错误报告是这样说的。但我无法理解这个理由背后的逻辑。谢谢!
答案 0 :(得分:2)
当你传递(或返回)一个数组时,实际得到的是指向所述数组的第一个元素的指针。
并且,由于您有一个PersonData*
元素数组,指向 数组的第一个元素的指针属于PersonData**
类型。
这应该有希望回答你当前的问题。
但是,我也想借此机会警告你成为一名C +程序员,这个奇怪的品种似乎用C ++编写C代码: - )
虽然C ++最初是基于的,但它经常说(好吧,我说它相当多)最难教C ++的人是C开发人员。
如果有人想成为C ++开发人员,他们应该尝试完全接受C ++&#34; mindset&#34;,包括考虑与您的代码相关的以下几点:
如果你传递的指针总是会引用一个实际的项目(而不是NULL
/ nullptr
),你几乎肯定会这样做错误。这就是创建引用的全部原因,我渴望将它们引入C中的日子,即使只是在函数调用中进行引用传递。
如果您将数据隐藏在某个类的私有部分后面,则可能是错误的想法将其暴露给使用公共API的任意修改。当我numList
时,您对auto x = obj.GetNumList(); x[0] = nullptr;
的保护尝试是无关紧要的。如果你必须这样做,你应该在至少返回指向const
的指针,以清楚地表明它不应该被修改。
您甚至应该考虑用std::vector
或std::array
替换基础级别数组,因为这两个数组都提供了修改超出范围元素的保护,并传递了大小信息< em> with 对象,你不能用原始指针获得的东西。
答案 1 :(得分:0)
在你的getNumList()
函数中,你想返回一个指针数组。
在C ++中返回函数数组的有效方法是返回指向第一个元素的指针(通常)。
因此,指针数组变为指向指针的指针(第一个元素)。
想想你什么时候有一个整数数组:
int *return_array(int ray[2])
{
return ray; // OR return &ray OR return &ray[0]
}
现在假设我们有整数指针代替整数,它将成为:
int **return_array(int *ray[2])
{
return ray; // OR return &ray OR return &ray[0]
}