在C ++中覆盖==运算符

时间:2019-07-01 04:04:15

标签: c++ overriding comparison-operators

我正在尝试为类重写==运算符,但是比较似乎以某种方式失败。当我编写与名为 eq 的函数相同的代码时(例如),不会发生任何问题。

class geo
{
    ...
        bool operator==(geo const& other)
        {
            if(_id != other._id) return false;
            if(!(name == other.name))return false; 
            if(is_primary!=other.is_primary)return false;
            for(int i = 0; i<6;i++){
                if(position[i]!=other.position[i])
                    return false;
            }
            return true;
        }
   ....
    private:
        int _id, is_primary;
        vector position;
        string name;

}

在主要功能中: ...

geo* i= new geo(2.1, 2.82, 1, 0, 0, 180, 0, "Patient-1",1);
geo* j= new geo(2.1, 2.82, 1, 0, 0, 180, 0, "Patient-1",1);
if(i==j)
    std::cout<<"they are equal\n";

但是,当我运行它时,它说它们对于i和j是不同的。知道我在哪里做错事了吗?

编辑: 谢谢盖兹的评论。我刚刚解决了; 上面显示的代码可以正常工作。当然,如果我正在尝试简化代码,以使此处粘贴可读性。因此,我正在更新上面的代码以使其成为一个问题,以便将来的读者可能会看到比我更好的解决方案,并且我可以学到更多。

2 个答案:

答案 0 :(得分:6)

通过执行i == j,您将比较指向geo的两个指针,而不是它们指向的对象。由于指针明显不同,因此可以得到结果。

要实际比较对象,您需要取消引用指针:

if (*i == *j) `

答案 1 :(得分:0)

在我看来,您的地理类的比较运算符是对其成员的字典比较。

您可能想知道,您可以使用func updateMaterial() { sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in let nod_name = node.name if nod_name != nil { if nod_name! == "triangle" { let material = SCNMaterial() let diffuseUrl = URL(string: "https://poly9.s3.ap-south-1.amazonaws.com/Arappfinish/Hexagon/Diffuse.jpg") let dimageData:NSData = NSData(contentsOf: diffuseUrl!)! material.diffuse.contents = UIImage.sd_image(with: dimageData as Data) material.isDoubleSided = true material.diffuse.contentsTransform = SCNMatrix4MakeScale(8, -8, 8) material.diffuse.wrapS = .repeat material.diffuse.wrapT = .repeat node.geometry!.materials = [material] } } } } 通过按适当的顺序构建成员tuple来统一所有比较运算符。

示例:

std::tie