自动铸造[关闭]

2024-05-13

我现在正在遭受脑放屁的痛苦。我以前曾经这样做过,但我不记得确切的语法,也无法查看我编写的代码,因为我当时在另一家公司工作。我有这样的安排:

class P
{
// stuff
};

class PW : public P
{
// more stuff
};

class PR : public P
{
// more stuff
};

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

// ...
    P p = c.GetP( ); // valid
    PW p = c.GetP( ); // invalid
    PR p = c.GetP( ); // invalid
// ...

现在我想让 P 与 PW 和 PR 互换(因此 PW 和 PR 可以互换)。我可能可以摆脱强制转换,但仅在这个模块中,这种代码更改就发生了很多次。我很确定这是一个操作员,但我一辈子都不记得是什么了。

如何用最少的代码使 P 与 PW 和 PR 互换?

Update:提供更多说明。 P 代表 Project,R 和 W 分别代表 Reader 和 Writer。读者拥有的只是用于加载的代码——没有变量,而作者拥有的是用于简单写入的代码。它需要分开,因为读取和写入部分有各种管理器类和对话框,这不是项目真正关心的项目文件的操作。

Update:我还需要能够调用 P 和 PW 的方法。因此,如果 P 有一个方法 a() 和 PW 作为方法调用 b() 那么我可以:

PW p = c.GetP();
p.a();
p.b();

基本上是为了使转换透明。


如果你想让这部分编译:



// ...
    P p = c.GetP( ); // valid
    PW p = c.GetP( ); // invalid
    PR p = c.GetP( ); // invalid
// ...

您需要能够将 P 构建/转换为 PW 或 PR。 你需要做这样的事情:



class PW : public P
{
    PW(const P &);
// more stuff
};

class PR : public P
{
    PR(const P &);
// more stuff
};

或者你的意思更像是:


class P
{
    operator PW() const;
    operator PR() const;
// stuff
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动铸造[关闭] 的相关文章

随机推荐