質問
このようなコードをコンパイルしようとしています:
#include <iostream>
using namespace std;
class CPosition
{
private:
int itsX,itsY;
public:
void Show();
void Set(int,int);
};
void CPosition::Set(int a, int b)
{
itsX=a;
itsY=b;
}
void CPosition::Show()
{
cout << "x:" << itsX << " y:" << itsY << endl;
}
class CCube
{
friend class CPosition;
private:
CPosition Position;
};
main()
{
CCube cube1;
cube1.Position.Show();
cube1.Position.Set(2,3);
cube1.Position.Show();
}
ただし、「CCube :: Position」は関数main()で3回アクセスできません。 クラスCPositionをCCubeの外部で宣言して、将来新しいクラスで使用できるようにします。 CBall :)しかし、どのように継承を使用せずに動作させることができます。可能ですか:)?
よろしく、 PK
解決
通常のゲッターに加えて、constゲッターも必要です。
参照による返品に注意してください。これにより、SetXX()を呼び出して、更新中のコピーではなく、CCube内のPositionのコピーに影響を与えることができます。
class CCube
{
private:
CPosition Position;
public:
CPosition& getPosition() { return Position; }
CPosition const& getPosition() const { return Position; }
};
他のヒント
ステートメント friend class CPosition;
は、CPositionがCCubeクラスのプライベートメンバーにアクセスできるようになったことを意味します。他のすべてのクラスにとって、メンバーは宣言したとおりにプライベートです。サンプルを動作させるには:
class CCube
{
public:
CPosition Position;
};
エラー、いいえ、位置は関数&quot; main&quot;に表示されません
Make it public ...またはpublic getter function in in
友達の宣言は次のようにする必要があります
friend int main();
CCubeのプライベートメンバーにアクセスするための「メイン」権限を付与しています。
まあ、あなたはすでにエラーの答えを得ています。しかし、一つのこと: CPositionのプライベートメンバー(itsX、itsY)にキューブをアクセスさせる予定はありますか?そうでない場合は、友人として宣言する必要はありません。もしそうなら、XとYを返すようにCPositionのパブリックメソッドを公開することを検討してください。それでも、それをフレンドとして宣言する必要はありません。
私が言っているのは、友達を使う必要があることを確認する必要があるということです。 開始するのに適した場所です。
OK:動作します:
class CCube
{
private:
CPosition Position;
public:
CPosition& getPosition() { return Position; }
};
main()
{
CCube cube1;
cube1.getPosition().Show();
cube1.getPosition().Set(2,3);
cube1.getPosition().Show();
}
ありがとう
1つに3つの質問があります:
-
CPosition
の再利用性
- シェイプの状態に影響を与える方法(この場合、
CPosition
型のメンバーが含まれますが、int radius
または他の何かが含まれる場合もあります) -
friend
キーワードの使用
明らかに、CPositionクラスは他の場所からアクセスできる必要があると言います。まあ、それはクラスです。問題1は解決されました。
CCube
ユーザーが CCube
の位置を変更できるようにするには、そのための手段を提供する必要があります。
-
CCube :: Position
をパブリックにする - アクセサメソッドを追加することにより-
CCube :: MoveTo(const CPosition&amp; p)
およびCCube :: GetPosition()const
。
@Firasが言ったように、本当に必要だと確信するまで、 friend
で遊んではいけません。