0

在我搞砸了我之前的帖子的描述之后,我坐下来试图表达我的确切意图。

我有一个名为 P 的类,它执行一些不同的目的。我也有 PW,它在 P 上执行一些不同的目的。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 的实例吗?那么从 P 继承 PW 是有意义的。

是有关系吗?然后你应该坚持包含,并忍受语法上的不便。

顺便说一句,在类的公共接口中公开对成员变量的非常量引用通常不是一个好主意。

于 2008-09-24T15:00:50.887 回答