我有两个类。其中一个没有返回值和抛出值,另一个有返回类型并且不抛出任何东西。我想要实现的是在彼此之间转换类并调用它们的函数,我可以不要使用静态方法来调用函数。代码块的示例;
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
答案 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
移动到基类并使其成为纯虚拟,但它们的返回类型不同,因此无法使返回类型相同,或者不能移动到基类范围。