1

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

基本上我有一个类“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;
}

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

编辑:在我的项目中,我有一个类 Manager 并且该类有指向clientsorders的指针数组。类订单除其他外接收客户端,这就是为什么我必须访问该指针数组,以选择要在订单中插入的客户端

4

3 回答 3

1

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

可访问性由private、等控制publicprotected并且可以通过“友谊”额外授予。另一方面,作用域由被访问的变量和函数的位置控制。

为了让一个类的成员访问另一个类的成员,其他成员必须在范围内;它也必须是可访问的。看来您正试图_bc从声明的类OtherClass的 a访问。友谊解决了问题的可访问性部分,但没有解决范围部分。为了访问类的实例成员,它必须具有对对象的某种引用。获取引用的方法有很多——例如,您可以在 的构造函数中传递对 的引用,将其存储在私有变量中,然后通过它进行访问,如下所示:friend_bcOtherClass_bcManagerManagerManagerOtherClass_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静态等。确切的方法取决于您的要求。

于 2012-12-26T01:51:58.233 回答
1

首先,您似乎不需要指向指针类型的指针_bc。只需在 class 中定义一个数组OtherClass(或者 anstd::vector实际上更好)并制作Managera friendof OtherClass。当然,您可以从和类中删除friend声明:BaseClassManager

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;
};
于 2012-12-26T01:39:06.360 回答
0

您的代码即使编译也不会运行,因为您没有正确分配 BaseClass 实例。此外,您对 raw 的使用new[]非常令人担忧。考虑使用std::vector<BaseClass>orstd::vector<std::unique_ptr<BaseClass>>代替。

在您的 OtherClass 中,您将不得不采用 Manager 指针或引用并延迟其 print() 成员的定义。编译器完全正确地告诉您在范围内OtherClass::print没有调用任何内容。_bc您必须显式传递Manager实例。

于 2012-12-26T01:36:22.193 回答