C++比较不同类型指针的方法?

6

我很难找到关于这些东西的信息!:(

我不明白为什么这个不起作用:

vector<B*> b;
vector<C*> c;
(B and C are subclasses of A) 
(both are also initialized and contain elements etc etc...) 

template <class First, class Second>
bool func(vector<First*>* vector1, vector<Second*>* vector2)
   return vector1 == vector2; 

编译时会返回以下结果:
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

我认为这应该是可行的,指针保存地址对吧?那么为什么不直接比较两个向量指针是否指向同一个地址呢?


指针以实现定义的方式保存地址。reinterpret_cast<> 可以根据类型自由更改实际数值。 - user529758
请看一下 C++ 中的静态转换和动态转换。 - user1939168
1
你究竟想要实现什么?一种类型的向量指针永远不应该等于另一种类型的向量指针。也许你可以使用你的“func”方法发布一些代码。 - dunc123
@dunc123,我将其作为一种安全机制,以防出现这种情况:func(b, b) - optional
我的意思是使用强制类型转换到void*... - jcoder
显示剩余5条评论
2个回答

8
这是一个简单的示例,如果按照您所要求的方式操作将不起作用。
struct A{ int i; };
struct OhNoes { double d; };
struct B: public A {};
struct C: public OhNoes, public B {};

在这里,B和C都是A的子类。然而,C的实例不太可能与其B子对象具有相同的地址。

也就是说,下面这个:

C c;
B *b = &c; // valid upcast
assert(static_cast<void*>(b) == static_cast<void *>(&c));

将会失败。


1
如果 FirstSecond 是相同类型,那么这就是 OP 会遇到的问题。如果不是,则他们的问题在于比较两个不相关类型的指针。 - juanchopanza
2
@juanchopanza:措辞可能不是最精确的,但他在潜在问题上是正确的:您不能比较指针忽略类型(这就是问题所在),因为即使对象相同,上面的比较也会失败。+1 - David Rodríguez - dribeas
实际上,对于某些类型可能有一种方法... dynamic_cast<void*> 不应该总是找到最派生类型的地址吗? - Useless
这意味着,如果我将两个指针强制转换为相同的类型(并且它们都继承自此类型),则比较有效,无论继承链是如何构建的?我理解得对吗? - Selmar

4
你的两个向量是不同类型的,无法进行比较。
如果你想要检查是否调用了func(b, b),你可以尝试:
template <typename T> bool func(vector<T> const & a, vector<T> const & b)
{
if (&a == &b) return false;
// do stuff
return true;
}

除非你在做一些非常奇怪的事情,否则不同类型的两个向量的指针将不相等。如果你尝试使用两个不同类型的向量调用func函数,则会得到编译器错误。


这个模板只有一个类型,但我需要比较可能具有不同类型的向量指针,以检查它们是否指向相同的向量。难道我完全无法做到这一点吗? - optional
@optional: 也许你可以编写一些代码,使得这种情况成立,即两个具有不同类型的向量指针指向同一个向量? - dunc123
@optional: 怎么会发生这种情况呢?一个对象有一种类型,在内存中的某个位置,可以是类型T的对象,也可以是类型U的对象(或者是不相关的对象,或者根本没有对象...),但是对于不相关的类型T和U,永远不可能同时存在类型T和类型U的对象(尽管它可能是既是T又是U类型的对象(通过继承实现),但在std::vector中不会出现这种情况!) - David Rodríguez - dribeas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接