gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:57:18 32 4
gpt4 key购买 nike

在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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com