如何通过 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<int> pool(K);
第二件事是,即使所有这些int pool[K]
甚至std::vector<int> pool
都是局部变量。当函数返回时你会指向什么?
【参考方案1】:
TokenPool::TokenPool(int K)
...
int pool[K];
...
pointToPool = pool;
pool
在堆栈上声明,因此一旦构造函数返回,它就不再存在。您将其地址分配给this->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++ 中指向该数组的指针访问另一个类中的数组?的主要内容,如果未能解决你的问题,请参考以下文章