0

これに関する以前の投稿の説明を台無しにした後、私は座って、私の正確な意図を伝えようとしました。

私はいくつかの明確な目的を実行するPと呼ばれるクラスを持っています。また、Pで明確な目的を実行するPWもあります。PWにはメンバー変数はなく、メンバー関数のみがあります。

この説明から、コードは次のようになると想定します。

class P
{
public:
    void a( );
};

class PW
{
public:
    PW( const P& p ) : p( p ) { }
    void b( );
    P& p;
};

class C
{
public:
    P GetP( ) const { return p; }   
private:
    P p;
};

// ...
    PW& p = c.GetP( ); // valid
// ...

しかし、それは問題を引き起こします。どこでも間接参照なしでPの関数を呼び出すことはできません。

// ...
    p->p->a( )
// ...

私がやりたいのは、p-> a()を呼び出して、Pのメンバー関数を呼び出したいと自動的に判断するようにすることです。

また、aと呼ばれるPWのメンバーを持っていることは、実際にはスケーリングしません-Pに別の関数を追加(または削除)した場合はどうなりますか-これはPWに追加(または削除)する必要があります。

4

3 に答える 3

2

operator* と operator-> をオーバーライドして、埋め込まれた p へのアクセスを返すことができます。このような何かがトリックを行うかもしれません:

class P
{
  public:
    void a( ) { std::cout << "a" << std::endl; }
};

class PW
{
  public:
    PW(P& p) : p(p) { }

    void b( ) { std::cout << "b" << std::endl; }

    P & operator*()  { return p;  }
    P * operator->() { return &p; }

  private:
    P & p;
};

class C
{
  public:
    P & getP() { return p; }

  private:
    P p;
};


int main()
{
  C c;
  PW pw(c.getP());

  (*pw).a();
  pw->a();
  pw.b();

  return EXIT_SUCCESS;
}

このコードは印刷します

a
a
b

ただし、このメソッドは、operator* と operator-> のセマンティクスが少し混乱するため、ユーザーを混乱させる可能性があります。

于 2008-09-24T10:46:39.220 に答える
1

前の質問のように、P を PW のスーパークラスにすると、p->a() を呼び出すことができ、クラス P に転送されます。質問。もしそうなら、なぜこれがうまくいかないのか詳しく説明していただけますか?

于 2008-09-24T10:05:26.743 に答える
0

PWとPの間にどのような関係があるのか​​を考える必要があると思います。

それは関係ですか?PWインスタンスはPのインスタンスですか?次に、PWにPから継承させることは理にかなっています。

それは持っている関係ですか?次に、封じ込めに固執し、構文上の不便を我慢する必要があります。

ちなみに、クラスのパブリックインターフェイスでメンバー変数への非定数参照を公開することは一般的に良い考えではありません。

于 2008-09-24T15:00:50.887 に答える