创建类数组时 -> 的基本操作数有非指针类型错误

Posted

技术标签:

【中文标题】创建类数组时 -> 的基本操作数有非指针类型错误【英文标题】:Base Operand of -> has non-pointer type error when creating an array of classes 【发布时间】:2021-02-02 18:00:39 【问题描述】:

我想了解为什么基操作数 -> 在与指针一起使用时在某些情况下有效,而在其他情况下无效。

我意识到当我收到此错误时,我需要使用 . 而不是 ->。我试图理解为什么当我将指针作为数组元素引用为p[i].somefunct() 时需要.,而当我将指针直接引用为(p+i)->somefunct() 时需要->

我编写了一个示例程序来说明这两种方法,想知道是否有更有经验的人可以解释这种 C++ 行为。

我也有兴趣了解是否有更好的方法来创建、访问和销毁指向存储在堆上的类的指针数组。

#include <iostream>
using namespace std;

class KClass 
public:
    int x;
    KClass();
    ~KClass();
    int getx() return x; 
    void setx(int data) x = data; return; 
;

int main()

    //use the heap to create an array of classes
    KClass *pk = new KClass[3]; //array of 3 pointers
    KClass *pk1 = new KClass[3]; //array of 3 pointers
    //do something
    for (int i = 0; i < 3; i++)
        (pk+i)->setx(i);
        cout << "(pk+" << i << ")->getx(): " << (pk+i)->getx() << endl;
    
    cout << endl;
    for (int i=0;i<3;i++)
        //does not compile: pk1[i]->setx(i);
        //why is different syntax required when I access pk1 as an element of an array?
        pk1[i].setx(i);
        cout << "pk1[" << i << "].getx(): " << pk1[i].getx() << endl;
    
    delete [] pk;
    delete [] pk1;
    pk = nullptr;
    pk1 = nullptr;

    getchar();
    return 0;

【问题讨论】:

【参考方案1】:

区别很简单。 p[i]*(p + i) 完全相同。完全一样,i[p] 是一种有效的(尽管超级混乱)的数组订阅形式。

因此,当您使用p[i] 表单时,您已经取消引用结果,因此您可以通过. 成员访问来访问成员。

如果您使用(p + i) 而不取消引用,则需要通过-&gt; 访问运算符访问成员,因为您正在处理指针。

只是一个重新散列 - -&gt; 只不过是方便快捷。每当你写像a-&gt;x 这样的东西时,你总是可以写成(*a).x

【讨论】:

以上是关于创建类数组时 -> 的基本操作数有非指针类型错误的主要内容,如果未能解决你的问题,请参考以下文章

删除时出错:表达式必须是指向完整对象类型的指针

如何通过JNI将java中的对象的地址赋值给c++指针变量

C语言提高内容目录

如何使用 cppyy 从指针索引类数组

数组常见操作Arrays类基本数据类型包装类

C++如何用new动态开辟一个一维字符数组