2013-10-13 43 views
4

比方说,我有以下类:重载操作员身体的奥秘

树和树;

对象树包含一个Tree对象的数组。

这里有树木和树类的内容:

Trees.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;} 

}; 

tree.h中:

#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; 
} 

据我当前的理解,程序应该输出“Tree has relatives”,因为第二个Tree(Trees.GetTree(1))是通过引用传递的,因此在==运算符的内部所做的任何更改都应该在其外部可见。 。

我在哪里错了?

+4

多么美丽的问题名称。 – aaronman

+0

那么,我可能已经过了那个... – Cover

回答

3

虽然operator==的语义学对变异它的参数有问题,您的具体问题是,你从GetTree返回副本:

Tree GetTree(int i){ return m_Tree[i];} 

因此的副本是否被修改当你申请==,然后他们扔掉。当您再次拨打GetTree时,新副本当然不会被修改。

你需要什么是

Tree& GetTree(int i){ return m_Tree[i];} 

能够修改存储在内部m_Tree[i]树。

+0

非常感谢你的快速反应。 – Cover