【发布时间】:2016-05-27 17:24:55
【问题描述】:
我有两个 std::vectors 指向类 A 和 B 的指针,我正在尝试创建一个从这些向量中删除对象的方法。此对象可能是也可能不是A 和/或B 的子类,并且不必是任何向量的元素。我试过以下代码:
void removeObject(void *object) {
A *pa = static_cast<A*>(object);
std::vector<A*>::iterator aPos = std::find(as.begin(), as.end(), pa);
if (aPos != as.end())
as.erase(aPos);
B *pb = static_cast<B*>(object);
std::vector<B*>::iterator bPos = std::find(bs.begin(), bs.end(), pb);
if (bPos != bs.end())
bs.erase(bPos);
}
但是指针有不同的值,所以std::find 不起作用(或者说它有时起作用)。在阅读了Multiple inheritance pointer comparison 和C++ pointer multi-inheritance fun 之后,我明白了原因,但在这两种情况下,建议的解决方案是将指针转换为*subclass。我的问题是:
- 如何检查两个指针是否指向同一个对象 不知道它的类型?
- 我的问题有更优雅的解决方案吗?
我是 C++ 新手,所以如果我完全误解了某些内容,请原谅...
【问题讨论】:
-
我不相信语言本身有解决方案。您的解决方案可能会涉及约定...例如,您要以这种方式比较的所有对象都将继承自一个(接口)类,该类提供一个返回 void* 的单个虚函数,该虚函数由 @987654331 实现@ 然后比较从该调用中返回的指针。如果您是 Windows 程序员 - 这就像您总是通过首先为 IUnknown 执行 QueryInterface 然后比较这两个 IUnknown 指针来比较两个 COM 对象。
-
请解释你的类层次结构。似乎 A 和 B 都需要通过一些公共基类来关联,这些基类将具有例如 for 形式的类型信息。枚举。在这种情况下,您可以将 void* 强制转换为该基类,并通过读取应该在创建类实例时设置的枚举来查找基础类型。可能还有其他一些棘手的解决方案,但我无法想出一个,尤其是多重继承变得更加棘手
标签: c++ pointers multiple-inheritance