所以我在尝试访问朋友类属性时遇到问题,我需要一个指向地图中第一个项目的指针。
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
我该如何解决这个问题?
答案 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