0

そのため、フレンド クラスのプロパティにアクセスしようとすると問題が発生します。マップ内の最初のアイテムへのポインターが必要です。

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 の無効な使用

どうすれば問題を解決できますか?

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には、型のオブジェクトが必要です:Adatabase

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

のプライベート メンバーへのアクセスを宣言するA::B必要がないことに注意してください(逆に動作します)は、ネストされているため、既にプライベート メンバーへのアクセス権を持っています。AfriendAfriendB

A::databaseinのイテレータをラップしたかったように思われる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を作成します。使用コードは次のとおりです。BA

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