質問

このようなコードをコンパイルしようとしています:

#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つの質問があります:

  1. CPosition
  2. の再利用性
  3. シェイプの状態に影響を与える方法(この場合、 CPosition 型のメンバーが含まれますが、 int radius または他の何かが含まれる場合もあります)
  4. friend キーワードの使用

明らかに、CPositionクラスは他の場所からアクセスできる必要があると言います。まあ、それはクラスです。問題1は解決されました。

CCube ユーザーが CCube の位置を変更できるようにするには、そのための手段を提供する必要があります。

  1. CCube :: Position をパブリックにする
  2. アクセサメソッドを追加することにより- CCube :: MoveTo(const CPosition&amp; p)および CCube :: GetPosition()const

@Firasが言ったように、本当に必要だと確信するまで、 friend で遊んではいけません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top