1

これは C++ の仕組みに関する質問です。

私は修飾子を調べていて、ここでメソッドfriendの例を見つけましたstatic friend

しかし今、私はそれを機能させるために特定のことが行われた理由を理解するのに苦労しています.

また、これがどのような実用的なアプリケーションに使用できるかにも興味がありますか? いつ使用しますstatic friend? これは避けるべきですか?

これは、私が混乱している部分を指摘するためにコメントが追加されたコードです。

#include <iostream>

class A; //1. why declare class A here and define it below?

class B
{
public:
    B();
    ~B();

    static void SetAiPrivate(int value); //Makes SetAiPrivate static
    static A *pa; //static instance of class A for class B's static 
                  //methods to use
};

class A
{
friend void B::SetAiPrivate(int); //Gives Class B's SetAiPrivate method access
                                  //to A's private variables

public:
    A(){iPrivate = 0;}
    ~A(){}
    void PrintData(){ std::cout << "iPrivate = "<< iPrivate<<"\n";}

private:
    int iPrivate;
};


A *B::pa;//2. Why is this needed? 
         //   If commented out it causes an external linking error.

B::B()
{
    pa = new A;
}     
B::~B()
{
    delete pa;
}

void B::SetAiPrivate(int value)
{
    pa->iPrivate = value;
}

int main()
{
    B b; //3. Is this necessary? Doesn't C++ automatically initiate static
         //   member variables when a class is referenced

    B::SetAiPrivate(7);
    B::pa->PrintData();
    return 0;
}
4

2 に答える 2

1

最初にコードを見てみましょう:

クラスA; //1。ここでクラスAを宣言し、以下で定義するのはなぜですか?

これは前方宣言です。BタイプのメンバーがあるA*ため、A事前に宣言する必要があります。

A * B :: pa;//2。なぜこれが必要なのですか?

静的データメンバーは、クラス定義内でのみ宣言されます。これが定義であり、標準では単一の翻訳単位に存在する必要があります。

B b; //3。これは必要ですか?クラスが参照されるときに、C++は静的//メンバー変数を自動的に開始しません

必要はありません。staticもちろん、のメソッドがBコンストラクターの実行に依存しない限り。もしそうなら、それは悪いデザインです。

質問にfriend。通常、友達がいると、メンバーだけであろうとクラス全体であろうと、カプセル化が破られます。これも例外ではありません。A::iPrivateから直接アクセスできることをコンパイラに通知するだけB::SetAiPrivateです。

からではなく、からA直接メンバーを設定できるようにしたいので、これは私には間違っているように見えます。AB

于 2012-08-30T21:54:56.220 に答える
1

1ここで​​クラスAを宣言し、以下で定義するのはなぜですか?

クラスBにはAのインスタンスへのポインターが含まれているため、クラスBの後にAを定義する場合は、前方宣言Aを行う必要があります。クラスBの前にクラスAを定義した場合、これは必要ありません。

2なぜこれが必要なのですか?

静的メンバーは、クラス定義外のどこかで初期化する必要があります

3これは必要ですか?クラスが参照されるときに、C++は静的メンバー変数を自動的に開始しません

AFAIKは、あなたが言及したまさにその理由から、これは必要ないことを知っています

于 2012-08-30T21:55:55.493 に答える