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

时间:2012-12-26 01:32:08

标签: c++ arrays pointers

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

基本上我有一个类“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: 在我的项目中,我有一个类管理器,该类有一些指向客户端订单的指针。 订单类除了其他内容之外还有客户端,这就是为什么我必须访问指针数组,选择要插入的客户端顺序

3 个答案:

答案 0 :(得分:1)

首先,您似乎不需要指向_bc的指针类型的指针。只需在班级OtherClass中定义一个数组(或者std::vector实际上更好),并使Manager成为friend OtherClass。当然,您可以从friendBaseClass类中删除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 ++中,有两个不同的概念 - 可访问性范围。从你的问题来看,你似乎把这两个概念混淆了(我不怪你,因为它们彼此非常接近)。

辅助功能由privatepublicprotected等控制,并且可以通过“友谊”另外授予。另一方面,范围由所访问的变量和函数的位置控制。

为了让一个类的成员访问另一个类的成员,其他成员必须在其范围内;它也必须是可访问的。您似乎正在尝试从_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实例。