c++ - 自动铸件

标签 c++ casting

<分区>

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

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 可以互换)。我可能可以摆脱强制转换,但仅在这个模块中,此代码更改就发生了很多次。我很确定它是一个运算符(operator),但我记不得是什么了。

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

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

更新:我还需要能够调用 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
};

关于c++ - 自动铸件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/121922/

相关文章:

c++ - 在Visual Studio中使用枚举的编译错误

c++ - AutoCAD C++ AcDbEntity 何时需要打开读取?

java - 在 Java 中返回通用对象(例如列表)的更清洁的解决方案

c++ - 无法从 vector<T> 转换为 T

Java Map - 整数值转换为字符串

C++ 字符串交换字符位置

c++ - 如何在离线状态下检测当前的 Windows 更新状态?

C++ 获取对返回对象的引用

c float 到 int 的转换行为很奇怪

java - JVM跳转指令的偏移量怎么会是32768呢?