2

フレンド関数について読んだだけで、クラス B のフレンド関数「Print」を使用して、クラス A のプライベート変数「number」にアクセスしようとしています。Visual Studio で作業しています。コードをコンパイルすると、次のようなさまざまなエラーが多数発生します。

C2011: 'A': 'class' 型の再定義
C2653: 'B': はクラスまたは名前空間の名前ではありません

私と一緒に辛抱強く、私の目標を達成するための適切な方法を示してください。

ここに私のファイルがあります:

class A
{
public:
    A(int a);
    friend void B::Print(A &obj);
private:
    int number;
};

A.cpp:

#include "A.h"

A::A(int a)
{
    number=a;
}

Bh:

#include <iostream>
using namespace std;
#include "A.h"
class B
{
public:
    B(void);
    void Print(A &obj);
};

B.cpp:

#include "B.h"

B::B(void){}

void B::Print(A &obj)
{
    cout<<obj.number<<endl;
}

main.cpp:

#include <iostream>
#include <conio.h>
#include "B.h"
#include "A.h"

void main()
{
    A a_object(10);
    B b_object;
    b_object.Print(A &obj);
    _getch();
}
4

2 に答える 2

3

... 次に、フレンドとして参照するためBに、A.hヘッダー ファイルでクラスの前方宣言が必要になる場合があります。B

#ifndef _A_H_
#define _A_H_
class B;

class A
{
     friend class B;
};
#endif

更新
現在、メンバー関数をフレンドとして宣言できるかどうかはよくわかりません。見てみましょう。

メンバー関数friend宣言を作成することはできません。グローバル関数またはクラス全体をフレンドとして宣言できます。C++ ref、フレンドシップおよび継承も参照してください。

一般に、これを使用するのは良い設計アイデアではありませんfriend。これは、クラスを強力に結合するためです。より良い解決策は、インターフェイスを結合することです (公開する必要はありません)。
まれに、それが適切な設計上の決定である場合もありますが、ほとんどの場合、内部の詳細に当てはまります。

于 2012-12-14T19:25:57.327 に答える
1

最初に置く必要があります

#ifndef A_H
#define A_H
.... your A-class definition
#endif

あなたのAhとBhの類似物で、同じファイルの複数のインクルードが防止されるようにします(つまり、重複した定義エラー)。

于 2012-12-14T19:14:10.197 に答える