C ++朋友类地图

时间:2016-01-08 11:16:47

标签: c++ dictionary non-static friend-class

所以我在尝试访问朋友类属性时遇到问题,我需要一个指向地图中第一个项目的指针。

class.h

class A{

    private:
    map<int,float> database;
    public:
    ......
    class B{
        private:
          map<int,float>::iterator it;
        public:
            friend class A;
            B begin();
    }

}

和implem.hxx

A::B A::B::begin(){
            A::B it;
            ite.it = database.begin();
            return ite;
}

但它在编译时显示出一个问题:     错误:无效使用非静态数据成员A :: database

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

除了一些语法问题之外,我还看到A::database尝试访问A::B::begin()变量。但是这个变量不是静态的以这种方式访问​​它,并且B类也不是从A派生的。所以,imho的问题与友谊无关。

答案 1 :(得分:0)

首先要注意的是,让A成为B的朋友是完全多余的。 C ++中的内部类可以访问外部类的私有成员。但是,当您创建实例时B,没有A类的实例,您正试图访问该地图。你需要一个实例。

答案 2 :(得分:0)

例如,

A::B没有像Java一样的A封闭式创建实例 - begin需要类型为A的对象才能访问其database }:

A::B A::B::begin(A& a) {
    A::B b;
    b.it = a.database.begin();
    return b;
}

请注意,A::B无需将A声明为friend即可访问A的私有成员(friend以相反的方式工作){ {1}}已经可以访问私有成员,因为它是嵌套的。

在我看来,你想在B中包含A::database的迭代器,所以希望这会指向正确的方向:

B

现在class A { std::map<int,float> database; public: class B { friend class A; std::map<int,float>::iterator it; explicit B(std::map<int,float>::iterator it) : it(it) { } ... }; B begin(); }; A::B A::begin() { return B(database.begin()); } begin的成员函数,并使用仅A可以访问的私有构造函数创建B。这是使用代码:

A