C ++两个类互相转换并调用它们的函数

时间:2014-07-20 00:57:07

标签: c++ class oop casting

我有两个类。其中一个没有返回值和抛出值,另一个有返回类型并且不抛出任何东西。我想要实现的是在彼此之间转换类并调用它们的函数,我可以不要使用静态方法来调用函数。代码块的示例;

  class ThrowableA{
        public:
            void getvalue();
    }

    class ReturnTypeA{
        public:
            int getvalue();
    }


    class BaseTypeA{//this will accept ThrowableA and ReturnTypeA
    ...
    };

    BaseTypeA * d = new ThrowableA();
    d->getvalue(); // this will call ThrowableA::getvalue
    (do something with d)->getvalue();//this will call ReturnTypeA::getvalue
    BaseTypeA * f = new ReturnTypeA();
    f->getvalue();//this will call ReturnTypeA::getvalue
    (do something with f)->getvalue();//this will call ThrowableA::getvalue

2 个答案:

答案 0 :(得分:1)

我认为您需要定义复制构造函数(或移动构造函数);或者,您可以定义转换运算符:

class ThrowableA : public BaseTypeA
{
    public:
        explicit ThrowableA(const ReturnTypeA& rt);
        void getvalue();
        // or explicit operator ReturnTypeA() const;
}

class ReturnTypeA : public BaseTypeA
{
    public:
        explicit ReturnTypeA(const ThrowableA& ta);
        int getvalue();
        // or explicit operator ThrowableA() const;
}

explicit关键字表示只有在您的代码专门请求转换时才会进行转换。如果没有该关键字,语言将在必要时自动执行最多一次转换,这可能会导致意外。 Bjarne Stroustrup's FAQ提到了明确的转换运算符;它显然是一个C ++ 11特性(而显式构造函数来自C ++ 03)。

继承转换需要继承 ,但似乎与您想要的设置相匹配。

然后,要从一个转换为另一个,只需创建另一个对象:

ThrowableA ta;
// Work with ta, add data, etc.
ReturnTypeA ra(ta);
// Use ra.

答案 1 :(得分:0)

您需要以这种方式重新定义代码:

class BaseTypeA;
class ReturnTypeA;

class ThrowableA : public BaseTypeA{
    public:
        explicit ThrowableA(ReturnTypeA const & rhs);
        explicit operator (ReturnTypeA const)(); // explicit conversion operators is a C++11 feature
        void getvalue();
};

class ReturnTypeA : public BaseTypeA{
    public:
        explicit ReturnTypeA(ThrowableA const & rhs);
        explicit operator (ThrowableA const)();     
        int getvalue();
};


class BaseTypeA{//this will accept ThrowableA and ReturnTypeA
...
};

BaseTypeA * d = new ThrowableA();
dynamic_cast<ThrowableA *>(d)->getvalue(); // getvalue isn't in scope of base class.
//(do something with d)->getvalue();//this will call ReturnTypeA::getvalue
BaseTypeA * f = new ReturnTypeA();
dynamic_cast<ReturnTypeA *>(f)->getvalue();//getvalue isn't in scope of base class.
//(do something with f)->getvalue();//this will call ThrowableA::get value

您可以考虑将getvalue移动到基类并使其成为纯虚拟,但它们的返回类型不同,因此无法使返回类型相同,或者不能移动到基类范围。