c++ - 你如何断言一个对象在 C++ 中有一个特定的方法?

标签 c++ oop c++11 exception assertions

在c++中如何断言一个对象有某个方法?或者当您尝试调用它但它不存在时抛出异常?这是我应该做的来处理我的问题吗?

我有一个容器类,里面有一个自定义对象。在容器方法中,我想调用“较小”对象的方法,但我需要先确保它存在。

我可能不应该将所需的方法作为此类中的纯虚函数,因为它也被不需要它以这种方式使用的不同容器类以其他方式使用。对吧?

最佳答案

C++ 不提供运行时检查是否存在手头特定对象的方法。但是您可以通过两种主要方式克服这个问题:(1) 在某些公共(public)基类级别使用(纯)虚函数,或者 (2) 检查手头对象的类型。

(1)纯虚函数方式:

class ContainerObject {
  ...
  virtual void somethingSpecific() = 0;
}
class MyContainerObject : public ContainerObject {
  ...
  virtual void somethingSpecific() {  ... }
}

因此,如果您获得一个指向ContainerObject 类型对象的指针,您可以依赖成员函数somethingSpecific() 的存在;请注意 ContainerObject 类是抽象的,因为它包含一个纯虚函数,即没有实现的虚成员函数:

ContainerObject *o = someContainer.getSomeObject();
o->somethingSpecific(); // compiler checks existence of `somethingSpecific`.

(2) 类型检查方法:

但是,如果您不想在一般级别公开somethingSpecific,您可以使用类型检查,例如动态类型转换。假设与上面类似的示例,但在 ContainerObject 类级别没有纯虚函数 somethingSpecific:

class ContainerObject {
  ...
  virtual void anyOtherVirtualFunction();
}
class MyContainerObject : public ContainerObject {
  ...
  virtual void somethingSpecific() {  ... }
}

基于动态转换的运行时类型检查然后尝试将 getSomeObject 返回的对象解释为 MyContainerObject:

MyContainerObject *o = dynamic_cast<MyContainerObject*>(someContainer.getSomeObject());
if (o != nullptr)  // does o point to a MyContainerObject?
  o->somethingSpecific(); 

请注意,getSomeObject 可能会返回一个不同于 MyContainerObject 的对象。在这种情况下,动态转换的结果将为空。因此,如果结果不为空,那么您可以依赖 o 指向 MyContainerObject 实例(它实现了 somethingSpecific)。

进一步注意,动态转换要求多态性到位,这意味着基类 ContainerObject 必须至少有一个虚拟成员函数(本例中为 anyOtherVirtualFunction ).

希望对您有所帮助。

关于c++ - 你如何断言一个对象在 C++ 中有一个特定的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643087/

相关文章:

c++ - 使用 SEH 时如何解释 GetExceptionCode 结果?

c# - OO设计,私有(private)方法之间传递参数还是访问成员变量?

c++ - 意外无法访问的基础(第一个派生类)

c++ - 引用能够引用不同的对象(不在迭代/循环体中)

c++ - 无法将 std::chrono 与 std::future 一起使用 - 未找到 GLIBCXX_3.4.19

c++ - usr/bin/ld : cannot find -l<nameOfTheLibrary>

c++ - 带有 restclient-cpp 的 JSON 属性树

c++ - 如何在 VertexArray 中翻转纹理?

oop - 了解简洁代码示例中的单一责任主体 SRP

c++ - 编译时排除部分函数模板