c ++比较对象

时间:2011-04-14 21:45:34

标签: c++

我想与对象进行比较,看看它们在C ++中是否相同。

如果我在C#中这样做,它将如下所示:

object result = human.find();
if (result == Human.NotFound) 
{ return ...

我如何在C ++中执行此操作?

[编辑] C ++代码:

Class HumanFamily : public std::map <ExString, Human> {
public:
   static const Human NoHumanFound;
const Human Find (const ExString& name ) const {
  HumanFamily::const_iterator it = find (name);
  if (it == this->end()) {
     return NoHumanFound;
}
return (it->second);
}

调用上述方法的类:

Object r = HumanFamily.begin()->Find (name);
if (r == HumanFamily.NoHumanFound) {
  return HumanFamily.NoHumanFound;

}

return r;

3 个答案:

答案 0 :(得分:1)

C ++语言没有 object 的概念,这是一个充当所有类的基类的类。考虑到这一点并假设您有一个Human类,您需要为该类定义operator ==。一种方法是:

class Human {
public:
    bool operator ==(Human const& ) const;
    /* ... */
};

然后再说:

bool are_they_the_same(Human const& human1, Human const& human2)
{
    return human1 == human2;
}

答案 1 :(得分:1)

C#代码实际上是比较地址 - 是对同一对象的两个引用,而不是这两个对象是否具有相等的值。

你不应该在C ++中重载operator ==具有相同的含义。在C ++中,它意味着检查两个可能不同的对象是否具有相同的值。 E.g ab可以是包含“Hello world”的不同字符串,因此a==b将为真。

您的特定代码

Object r = HumanFamily.begin()->Find (name);
if (r == HumanFamily.NoHumanFound) {
  return HumanFamily.NoHumanFound;

}

return r;

最有可能涉及切片(r的静态和动态类型将为Object),并且可能只是替换为

return HumanFamily.begin()->Find (name);

答案 2 :(得分:1)

这太可怕了。您不应该继承标准类(iostream除外),因为它们没有虚拟析构函数 - 尤其是当它可以被组合替换时。此外,std::map已经有NotFound值 - std::map<>::end();。最重要的是,你的函数没有任何意义,它看起来像你试图多态返回,但实际上它不是一个引用,它是一个值。

你需要得到一本关于C ++的书并实际理解它,因为这段代码让我觉得你真的需要帮助。

天哪,你只需要一本关于编程的书。您发布的用法功能可以替换为return HumanFamily.begin()->Find(name);