自动Casts redux

时间:2008-09-24 09:56:18

标签: c++ casting

在我messed up the description of my previous post之后,我坐下来试图传达我的确切意图。

我有一个名为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。

3 个答案:

答案 0 :(得分: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-&gt;的语义,这种方法可能会使用户感到困惑。变得有些混乱。

答案 1 :(得分:1)

如果你让P成为PW的超类,就像你在上一个问题中所做的那样,你可以调用p-&gt; a()然后它会指向P类。看起来你已经考虑并拒绝了这个从这个问题来看。如果是这样,您是否愿意详细说明为什么这对您不起作用?

答案 2 :(得分:0)

我认为你需要思考PW和P之间存在什么样的关系。

这是一种关系吗?是P的PW实例的实例?那么PW从P继承是有道理的。

这是一种关系吗?然后你应该坚持遏制,并忍受语法上的不便。

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