超负荷操作员身体的奥秘
The mysteries of an overloaded operator's body
假设我有以下类:
树木和树木;
对象树包含树对象的数组。
以下是树和树类的内容:
树.h:
#pragma once
#include "Tree.h"
class Trees
{
private:
Tree m_Tree[20];
int iTrees;
public:
Trees(void) : iTrees(0){}
Tree GetTree(int i){ return m_Tree[i];}
void AddTree(Tree tree){ m_Tree[iTrees++] = tree;}
};
树:
#pragma once
#include <string>
class Tree
{
private:
std::string Name;
bool HasRelatives;
public:
Tree(void):HasRelatives(0){};
Tree(std::string name):Name(name), HasRelatives(0){};
std::string GetName(){ return Name;}
void SetName(std::string name){ Name = name;}
bool GetHasRelatives(){ return HasRelatives;}
void SetHasRelatives(bool alone){ HasRelatives = alone;}
bool operator == (Tree & tree)
{
if(this->GetName() == tree.GetName())
{
this->SetHasRelatives(1);
tree.SetHasRelatives(1);
return 1;
}
return 0;
}
};
假设我正在使用这样的类(main.cpp):
#include <iostream>
#include "Trees.h"
int main()
{
Trees Trees;
Trees.AddTree(Tree("Oak"));
Trees.AddTree(Tree("Oak"));
if(Trees.GetTree(0) == Trees.GetTree(1))
{
std::cout<<"Trees are the same" << std::endl;
if(Trees.GetTree(1).GetHasRelatives() == 1)
std::cout<<"Tree has relatives" << std::endl;
}
return 0;
}
根据我目前的理解,程序应该输出"树有亲戚",因为第二个树(Trees.GetTree(1))是通过引用传递的,因此在 == 运算符主体内所做的任何更改都应该在它外面可见......
我错在哪里?
虽然operator==
改变其参数的语义是值得怀疑的,但您的具体问题是您从GetTree
返回副本:
Tree GetTree(int i){ return m_Tree[i];}
因此,当您应用==
时,副本会被修改,然后它们被丢弃。当您再次调用GetTree
时,新副本当然不会被修改。
你需要的是
Tree& GetTree(int i){ return m_Tree[i];}
以便能够修改存储在m_Tree[i]
中的树。
相关文章:
- <<操作员在下面的行中工作
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 比根<操作员
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 为什么"delete"操作员给我访问权限冲突
- 为什么使操作员成为新的专用会打破 std::shared_ptr?
- 在这种情况下是私有的吗?试图使操作员<<过载
- C++操作员过载>>
- 是否有 C++20 浮点数的包装器,使我能够默认宇宙飞船操作员?
- 与异常处理程序中的操作员<<不匹配
- 复印作业操作员说明
- 友谊和操作员+=重载
- >操作员在比较两个C++容器时会怎么做?
- 与操作员比较两个计时时间点
- C++操作员订单评估
- 超负荷操作员身体的奥秘