4

假设我有以下课程:

树和树;

Object Trees 包含一个 Tree 对象数组。

以下是 Trees 和 Tree 类的内容:

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

};

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

据我目前的理解,程序应该输出“树有亲戚”,因为第二棵树( Trees.GetTree(1) )是通过引用传递的,因此在 == 操作符的主体内所做的任何更改都应该在它之外可见......

我哪里错了?

4

1 回答 1

3

虽然operator==to mutate its arguments 的语义值得怀疑,但您的具体问题是您正在从以下位置返回副本GetTree

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

因此,在您申请时会修改副本==,然后将其丢弃。当您GetTree再次调用时,新副本当然不会被修改。

你需要的是

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

能够修改存储在里面的树m_Tree[i]

于 2013-10-13T16:54:57.390 回答