确定工厂方法返回的对象类(错误:函数不接受 1 个参数
Determine an object's class returned by a factory method (Error: function does not take 1 arguments
我有一个工厂方法,它要么返回一个baseclass
的对象,要么返回一个derivedclass
的对象(baseclass
的派生类)。派生类具有一个接受一个参数的方法virtual void foo(int x)
。 然而,baseclass
virtual void foo()
没有争论。
在我的代码中,工厂方法返回一个 bar 类型的指针,该指针明确指向类 derivedclass
的对象。但是,由于这仅在运行时已知,因此我收到一个编译器错误,指出foo()
不接受参数。我可以将此指针转换为类型 derivedclass
的指针吗?
std::auto_ptr<baseclass> bar = classfactory::CreateBar(); //returns object of class derivedclass
bar->foo(5);
class baseclass
{
public:
virtual void foo();
}
class derivedclass : public baseclass
{
public:
virtual void foo(int x);
}
回答您的问题:如果您确定实例属于正确的类型,则可以使用 static_cast
,否则dynamic_cast
。像这样:
std::auto_ptr<baseclass> bar = classfactory::CreateBar();
if (derivedclass *der = dynamic_cast<derivedclass*>(bar.get())) {
der->foo(5);
}
但是,像这样的代码通常暗示设计不好。您不需要访问派生类的细节。也许基类接口没有应有的完整?
您可以将baseclass*
转换为derivedclass*
。
使用 static_cast
: 如果baseclass*
的运行时类型不是 derivedclass*
的(子类),则得到未定义的行为。
使用 dynamic_cast
: 如果baseclass*
的运行时类型不是 derivedclass*
的(子类),则强制转换会产生一个空指针。为了允许此行为,将执行其他运行时检查。
现在你的柱线变量是基类类型,所以你不能执行 foo(int x)。您需要将其转换为适当的类型,如下所示:
std::auto_ptr<baseclass> bar = classfactory::CreateBar(); //returns object of class derivedclass
std::auto_ptr<derivedclass> bar_derived(dynamic_cast<derivedclass*>(bar.get()) ? (static_cast<derivedclass*>(bar.release())) : 0 );
bar_derived->foo(5);
相关文章:
- "error: no matching function for call to"构造函数错误
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- C++ OpenCV 卡尔曼滤波器构造函数错误
- C++:用户定义的显式类型转换函数错误
- C++ 合并字符串以'system'函数错误
- C++ wmain 函数错误时使用 Unicode
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- C++ 中常量属性的初始化构造函数错误
- 线程 std::调用未知类型,无法专门化函数错误
- 表单显示对话框函数错误,并且不执行下面的语句
- 函数错误 C2059:语法错误:'>'不起作用
- STL向量上出现奇怪的复制构造函数错误
- C++ Visual Studio 重载函数错误:没有重载函数的实例与指定的类型匹配
- C++引用已删除函数错误
- 为什么通过带有文字编号的引用调用会出现"无匹配函数"错误?
- C++ 乘法定义的构造函数错误消息似乎错误
- 在 c++ 代码中将数组传递给函数错误
- FFMPEG avcodec_decode_video2函数错误代码
- 为什么我会收到转换函数错误