如何通过 C++ 中指向该数组的指针访问另一个类中的数组?

Posted

技术标签:

【中文标题】如何通过 C++ 中指向该数组的指针访问另一个类中的数组?【英文标题】:How can I access an array in another class via a pointer to that array in C++? 【发布时间】:2021-03-14 10:43:08 【问题描述】:

通常为了从不同的类访问一个类/对象的成员变量,您会使用箭头运算符 (->)。在这种情况下,我想访问一个数组,但是数组的大小只有在运行时才知道,因此我不能在类的头文件中声明数组。其实我只是在类的构造函数中声明了数组。

我仍然需要能够从不同的类访问这个数组。我试图通过在第一个类的头文件中声明一个指针来做到这一点,然后在声明和初始化数组之后,让该指针指向数组的第一个元素。

头文件station.h:

class TokenPool 
public:
    TokenPool(int K);
    ~TokenPool();
       ...
public:
    int K;
    int *pointToPool;
;

然后在station.cpp中:

TokenPool::TokenPool(int K) 
    this->K = K;
    cout << "K = " << this->K << " in tokenPool" << "\n";
    int pool[K];

    for (int i = 0; i < K; i++) 
        pool[i] = i+1;
        cout << pool[i] << " tokens in class " << i << "\n";
    

    pointToPool = pool;

为简单起见,我们假设 K=1。 问题是当我尝试从不同的类访问数组时:

cout << "class " << this->k << " has " << *(station1->tokenPool->pointToPool+0) << " tokens.\n";

它会产生像这样的奇怪输出:

class 0 has 31156208 tokens.

如果 K=1,它应该实际显示:

class 0 has 1 tokens.

知道发生了什么吗?

【问题讨论】:

通常你不会。此外,您的代码中还有一个 UB。 int pool[K]; -- 这不是有效的 C++。 C++ 中的数组的大小必须由编译时常量而不是运行时值来表示。使用std::vector&lt;int&gt; pool(K); 第二件事是,即使所有这些int pool[K] 甚至std::vector&lt;int&gt; pool 都是局部变量。当函数返回时你会指向什么? 【参考方案1】:
TokenPool::TokenPool(int K) 
    ...
    int pool[K];
    ...
    pointToPool = pool;

pool 在堆栈上声明,因此一旦构造函数返回,它就不再存在。您将其地址分配给this-&gt;pool,但该地址不再指向有效内存。随后从此指针读取会导致未定义的行为。

C++ 的方式一般是避免使用原始数组,而使用std::vector。它使代码更简单、更安全,而且效率几乎没有降低:

#include <vector>

class TokenPool 
public:
    TokenPool(int K);
    ~TokenPool();
       ...
public:
    std::vector<int> pool;
;

TokenPool::TokenPool(int K) :
    pool(K)

    cout << "K = " << this->K << " in tokenPool" << "\n";

    for (int i = 0; i < K; i++) 
        pool[i] = i+1;
        cout << pool[i] << " tokens in class " << i << "\n";
    

【讨论】:

以上是关于如何通过 C++ 中指向该数组的指针访问另一个类中的数组?的主要内容,如果未能解决你的问题,请参考以下文章

c ++如何获取指向另一个类中的当前对象的指针?

为啥 C++ 允许通过指针访问枚举?

如何从该数组中检索信息?

C++ 指向类的指针

Swift - 使用Object创建Parse类,该Object是指向另一个类中对象的指针

访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组