【问题标题】:How correctly overload conversion from base class to inherit如何正确重载从基类到继承的转换
【发布时间】:2017-12-14 10:34:30
【问题描述】:

我认为我的问题简单明了:

我有AbstractMatrix的基类和它的子类Matrix,我想做简单的转换:

namespace mtrx {
/* mycode */
    class AbstractMatrix {
        public:
        /* -//- */
        operator Matrix ();
        /* -//- */
    }
    class Matrix : public AbstractMatrix {
    /* -//- */
    }
}

AbstractMatrix.cpp:

AbstractMatrix::operator Matrix(){
    return Matrix(data);
}

编译器给出消息:

Matrix.h:39:12: error: expected type-specifier before ‘Matrix’
   operator Matrix ();
            ^

我做错了什么? 是否可以进行这样的转换?我认为是的,因为我只想基于超类创建构造函数,但没有任何无聊的语法,我需要它是隐式的

谢谢

【问题讨论】:

  • 我更好奇你为什么需要这样做?运营商应该解决什么问题?难道你不能有一个返回AbstractMatrix 指针的虚拟“getter”函数吗?或者也许使用the CRTP 来了解子类?
  • 至于您的问题,您确实知道必须在使用符号之前声明(或有时甚至定义)符号?
  • 例如对于 foo(Matrix A);如果我在 B 是 AbstractMatrix 的情况下执行类似 foo(B) 的操作,则 B 将转换为 Matrix 类。感谢您的建议,我最近开始学习 C++,我将阅读有关虚函数和 CRTP 的内容,可能会对我有所帮助。

标签: c++ inheritance type-conversion operator-overloading overloading


【解决方案1】:

您应该简单地提供一个前向声明

namespace mtrx {

    class Matrix; // <=== here

    class AbstractMatrix {
        public:
        operator Matrix ();
    };

    class Matrix : public AbstractMatrix {

    };

}

使MatrixAbstractMatrix 类可见。


附:您可能应该重新考虑您的设计,因为将基类转换为派生类的转换运算符对我来说看起来很奇怪。

【讨论】:

  • 哦,我尝试在命名空间之上进行。关于设计 是的,我认为您的评论很恰当,但更多的是好奇为什么它不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 2020-01-03
相关资源
最近更新 更多