3

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

#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();
}

しかし、 get 'CCube::Position' は関数 main() で 3 回アクセスできません。クラスCPositionをCCubeの外で宣言して、将来CBallなどの新しいクラスで使用できるようにしたいのですが、継承を使用せずに機能させるにはどうすればよいですか。出来ますか :)?

よろしく、 PK

4

7 に答える 7

5

通常のゲッターに加えて、const ゲッターも必要です。
参考までに返品に注意してください。これにより、SetXX() を呼び出して、更新中のコピーではなく、CCube 内の Position のコピーに影響を与えることができます。

class CCube
{
    private:
        CPosition Position;
    public:
        CPosition&       getPosition()       { return Position; }
        CPosition const& getPosition() const { return Position; }
};
于 2008-10-29T12:32:49.680 に答える
4

このステートメントfriend class CPosition;は、CPosition が CCube クラスのプライベート メンバーにアクセスできるようになったことを意味します。他のすべてのクラスにとって、メンバーは宣言したとおりに非公開のままです。サンプルを機能させるには、次のようにします。

class CCube
{
     public:
         CPosition Position;
};
于 2008-10-29T10:20:45.250 に答える
1

エラー、いいえ、関数「メイン」で位置が表示されません

公開する...または公開ゲッター関数を入れる

于 2008-10-29T10:20:09.543 に答える
1

あなたの友人宣言は

friend int main();

CCube のプライベート メンバーにアクセスするための「メイン」権限を与えています。

于 2008-10-29T10:25:55.427 に答える
0

1つに3つの質問があります。

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

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

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

  1. CCube::Position公開することで
  2. アクセサメソッドを追加することによって-CCube::MoveTo( const CPosition& p )およびCCube::GetPosition() const

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

于 2008-10-29T11:09:31.750 に答える
0

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();
}

ありがとう

于 2008-10-29T10:52:09.243 に答える
0

さて、あなたはすでにエラーに対する答えを得ています。ただし、キューブが CPosition のプライベート メンバー (itsX、itsY) にアクセスする予定はありますか? そうでない場合は、フレンドとして宣言する必要はありません。そうである場合は、X と Y を返すように CPosition でパブリック メソッドを公開することを検討してください。それでも、それをフレンドとして宣言する必要はありません。

私が言いたいのは、友達を使う必要があることを確認する必要があるということです。ここから始めましょう

于 2008-10-29T10:25:53.680 に答える