在我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。
答案 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引用通常不是一个好主意。