2013-10-13 89 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