这是一个更大项目的一部分。
基本上我有一个类“X”来管理程序,并且该类有一个指向“Y”类对象的指针数组,还有另一个类“Z”,我需要访问该类的对象“ Y“,例如印刷品。
我收到错误“未在此范围内声明”
我试图让“Z”级的“Z”级朋友,但它不起作用。
我编写了代码来演示这个问题:
#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;
}
也许这很简单,但现在已经很晚了,我很困,我想在睡觉前解决这个问题。
EDITED: 在我的项目中,我有一个类管理器,该类有一些指向客户端和订单的指针。 订单类除了其他内容之外还有客户端,这就是为什么我必须访问指针数组,选择要插入的客户端的顺序
答案 0 :(得分:1)
首先,您似乎不需要指向_bc
的指针类型的指针。只需在班级OtherClass
中定义一个数组(或者std::vector
实际上更好),并使Manager
成为friend
OtherClass
。当然,您可以从friend
和BaseClass
类中删除Manager
声明:
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;
};
答案 1 :(得分:1)
在C ++中,有两个不同的概念 - 可访问性和范围。从你的问题来看,你似乎把这两个概念混淆了(我不怪你,因为它们彼此非常接近)。
辅助功能由private
,public
,protected
等控制,并且可以通过“友谊”另外授予。另一方面,范围由所访问的变量和函数的位置控制。
为了让一个类的成员访问另一个类的成员,其他成员必须在其范围内;它也必须是可访问的。您似乎正在尝试从_bc
OtherClass
访问friend
,_bc
是宣布OtherClass
的类_bc
。友谊解决了问题的可访问性部分,但它没有解决范围部分。要让Manager
访问Manager
Manager
类的实例成员,它必须具有OtherClass
某种类型的引用宾语。有很多方法可以获得引用 - 例如,您可以将引用传递给_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
的参数传递,使{{1}}成为指针,使{{1}}成为静态,依此类推。具体方法取决于您的要求。
答案 2 :(得分:0)
您的代码即使编译也无法运行,因为您没有正确分配BaseClass实例。此外,您对原始new[]
的使用非常令人担忧。请考虑改为使用std::vector<BaseClass>
或std::vector<std::unique_ptr<BaseClass>>
。
在您的OtherClass中,您必须获取Manager指针或引用并延迟其print()成员的定义。编译器完全正确地告诉您OtherClass::print
在范围内没有任何名为_bc
的内容。您必须明确传递Manager
实例。