我正在尝试为类重写==运算符,但是比较似乎以某种方式失败。当我编写与名为 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是不同的。知道我在哪里做错事了吗?
编辑: 谢谢盖兹的评论。我刚刚解决了; 上面显示的代码可以正常工作。当然,如果我正在尝试简化代码,以使此处粘贴可读性。因此,我正在更新上面的代码以使其成为一个问题,以便将来的读者可能会看到比我更好的解决方案,并且我可以学到更多。
答案 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