从另一个类访问指针数组的对象
access object of array of pointers from another class
这是一个更大项目的一部分。
基本上,我有一个类"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++中有两个不同的概念 -可访问性和范围。从你的问题来看,你似乎把这两个概念弄混了(我不怪你,因为它们彼此非常接近)。
可访问性由private
、public
、protected
等控制,可以通过"友谊"额外授予。另一方面,范围由要访问的变量和函数的位置控制。
为了使一个类的成员能够访问另一个类的成员,该其他成员必须在作用域内;它还必须是可访问的。您似乎正在尝试从OtherClass
访问_bc
,这是声明_bc
的类的friend
。友谊解决了问题的可访问性部分,但它没有解决范围部分。为了使OtherClass
访问_bc
,Manager
类的实例成员,它必须具有对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
更好),并Manager
friend
OtherClass
。当然,您可以从BaseClass
和Manager
类中删除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
实例。
- 销毁C++中动态分配的内存(数组对象)
- 数组对象的生存期是否在重用其元素存储时结束?
- 为什么顶点数组对象会导致错误?
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- OpenGL 顶点数组对象与 tinyobjloader
- 将数组/对象/结构列表从C#库中传递给C MFC应用程序
- C++ RapidJson 帮助反序列化数组对象
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- 检查成员函数是否返回临时对象或数组对象
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 当数组对象以函数参数传递时,为什么复制构造函数会自称
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- C++17 std::shared_ptr<> 类数组对象的重载运算符 []
- 添加两个具有运算符重载的数组对象,从而导致分段错误
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 使用相同的数据填充数组对象或使用指针
- 方法用于最快的分配,并且不需要将动态大小的数组对象作为局部变量
- 如何将2d数组对象传递给c++中的函数
- ReferenceTable溢出(jni-android),数组对象释放