我想与对象进行比较,看看它们在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;
答案 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 a
和b
可以是包含“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);
。