0

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

类.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;
}

但是编译的时候出现问题:error: invalid use of non-static data member A::database

我该如何解决这个问题?

4

3 回答 3

1

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

于 2016-01-08T11:31:42.723 回答
0

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

于 2016-01-08T11:35:12.707 回答
0

A::BA例如,在 Java中没有类似的封闭创建实例-begin需要一个类型的对象A来访问它database

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

请注意,不需要A::B声明访问私有成员(反过来工作)已经可以访问私有成员,因为它是嵌套的。AfriendAfriendB

在我看来,您想包装 in 的迭代器A::databaseB所以希望这可以为您指明正确的方向:

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());
}

Nowbegin是一个成员函数,并使用私有构造函数A创建一个只能访问的函数。这是使用代码:BA

A a;
A::B b = a.begin();
...
于 2016-01-08T11:35:21.397 回答