簡體   English   中英

C ++朋友班級地圖

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

現在beginA的成員函數,並使用僅A可以訪問的私有構造函數創建B 這是用法代碼:

A a;
A::B b = a.begin();
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM