从另一个类访问指针数组的对象

access object of array of pointers from another class

本文关键字:数组 对象 指针 访问 另一个      更新时间:2023-10-16

这是一个更大项目的一部分。

基本上,我有一个类"X"来管理程序,该类有一个指向类"Y"中的对象的指针数组,还有另一个类"Z",我需要在其中访问类"Y"的对象,例如打印。

我收到错误"未在此范围内声明">

我试图让"Z"类成为"Y"类的朋友,但它不起作用。

我编写了代码来演示这个问题:

#include <iostream>
using namespace std;
class BaseClass;
class OtherClass;
class Manager;
class BaseClass
{
friend class OtherClass;
public:
BaseClass(){}
void setNum(int num){_num = num;}
int getNum(){return _num;}
private:
int _num;
};
class OtherClass
{
public:
OtherClass(){}
void print(){
cout << _bc[0]->getNum() << " " << _bc[1]->getNum() << endl;
}
};
class Manager
{
friend class OtherClass;
public:
Manager(){}
void run(){
_bc = new BaseClass*[10];
_bc[0]->setNum(20);
_bc[1]->setNum(30);
_oc.print();
}
private:
BaseClass ** _bc;
OtherClass _oc;
};

int main()
{
Manager m;
m.run();
return 0;
}

也许这很简单,但这里已经很晚了,我很困,我想在睡觉前解决这个问题。

编辑: 在我的项目中,我有一个类管理器,该类具有指向客户端订单的指针数组。 类订单接收客户端等内容,这就是为什么我必须访问该指针数组以选择要在订单中插入的客户端

在C++中有两个不同的概念 -可访问性和范围。从你的问题来看,你似乎把这两个概念弄混了(我不怪你,因为它们彼此非常接近)。

可访问性由privatepublicprotected等控制,可以通过"友谊"额外授予。另一方面,范围由要访问的变量和函数的位置控制。

为了使一个类的成员能够访问另一个类的成员,该其他成员必须在作用域内;它还必须是可访问的。您似乎正在尝试从OtherClass访问_bc,这是声明_bc的类的friend。友谊解决了问题的可访问性部分,但它没有解决范围部分。为了使OtherClass访问_bcManager类的实例成员,它必须具有对Manager对象的某种引用。获取引用的方法有很多种 - 例如,您可以在OtherClass的构造函数中传递对Manager引用,将其存储在私有变量中,并通过它访问_bc,如下所示:

class OtherClass {
Manager &_m;
public:
OtherClass(Manager &m) : _m(m) {}
void print(){
cout << _m._bc[0]->getNum() << " " << _m._bc[1]->getNum() << endl;
}
};

这只是解决作用域问题的一种方法;其他方法包括传递Manager作为OtherClass::print的参数,使_m成为指针,使_bc静态,等等。确切的方式取决于您的要求。

首先,您似乎不需要指向指针类型的指针类型来进行_bc。只需在第OtherClass类中定义一个数组(或者实际上std::vector更好),并ManagerfriendOtherClass。当然,您可以从BaseClassManager类中删除friend声明:

class OtherClass
{
public:
OtherClass(){}
void print(){
cout << _bc[0].getNum() << " " << _bc[1].getNum() << endl;
}   
private:
BaseClass * _bc;
friend class Manager;
};
class Manager
{
public:
Manager(){}
void run(){
_oc._bc = new BaseClass[10];
_oc._bc[0].setNum(20);
_oc._bc[1].setNum(30);
_oc.print();
}
private:
OtherClass _oc;
};

即使编译了代码,代码也无法运行,因为您没有正确分配 BaseClass 实例。此外,您对原始new[]的使用非常令人担忧。请考虑改用std::vector<BaseClass>std::vector<std::unique_ptr<BaseClass>>

在你的 OtherClass 中,你必须采用一个管理器指针或引用,并延迟它的 print() 成员的定义。编译器完全正确地告诉您OtherClass::print在范围内没有称为_bc。您必须显式传递Manager实例。