[英]C++ friend class map
所以我在嘗試訪問朋友類屬性時遇到問題,我需要一個指向地圖中第一項的指針。
類
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
我該如何解決該問題?
除了一些語法問題,我看到嘗試在A::B::begin()
訪問A::database
變量。 但是,以這種方式訪問此變量不是靜態的,並且類B也不也從A派生。 因此,恕我直言的問題與友誼無關。
首先要注意的是,讓A成為B的朋友是完全多余的。C++中的內部類可以訪問外部類的私有成員。 但是,在創建B的實例時,沒有要嘗試訪問其映射的類A的實例 。 您需要一個實例。
A::B
沒有封閉的A
創建實例,例如在Java中- 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
可以工作),因為B
已嵌套,因此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
的成員函數,並使用僅A
可以訪問的私有構造函數創建B
這是用法代碼:
A a;
A::B b = a.begin();
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.