通过从 class B 到达它来更改 class A 实例的属性

Changing an attribution of an instance of class A via reaching it from class B

我一直在努力弄清楚如何在 C++ 中从另一个 class' 实例获取和更改一个实例的属性。貌似中间做了一个复制过程,不知道怎么解决

我有两个 classes,Woman 和 Man,每个在 main 中都有一个实例:分别是 Andy 和 John。两者都有名字,它们的名字是由它们自己的修改器设置的。然后我为 Andy 和 John 创建了一个名为 list 的矢量属性,并将他们加入到彼此的列表中。

现在我想在彼此的列表中找到并更改他们的名字。简而言之:

  1. 将约翰推回安迪的名单。

  2. 通过安迪的名单得到约翰的名字。

  3. 通过安迪的列表更改约翰的名字(这应该不仅会影响安迪列表中的项目名称,还会影响约翰本人的名字)。

据我所知,该解决方案应该对 pass-by-ref 做一些事情,但我不知道如何做,一旦包含 classes。

输出:

 name of persons Andy John
 name of persons Andy John
 name of persons AndySugars JohnWick \name of the person in Andy's and John's lists
 name of persons Andy John \name of Andy and John after changing their name from one-another's lists.

main.cpp:

#include "Man.h"


int main()
{
            Woman Andy;
            Man John;

            Andy.setName("Andy");
            John.setName("John");

            Andy.setList(John);
            John.setList(Andy);

            std::vector<Man> list_of_Andy = Andy.getList();
            std::vector<Woman> list_of_John = John.getList();

            std::cout << "name of persons in the lists " << list_of_Andy.at(0).getName() << " " << list_of_John.at(0).getName() << std::endl;
            std::cout << "name of persons " << Andy.getName() << " " << John.getName() << std::endl;


            list_of_Andy.at(0).setName("JohnWick");
            list_of_John.at(0).setName("AndySugars");

            std::cout << "name of persons in the lists " << list_of_Andy.at(0).getName() << " " << list_of_John.at(0).getName() << std::endl;
            std::cout << "name of persons " << Andy.getName() << " " << John.getName() << std::endl;

            int a;
            std::cin >> a;

            return 0;
}

classes.h:

#include<string>
#include<iostream>
#include<vector>

class Man;
class Woman;


class Man
{
public:
        Man();

        std::string name;
        std::vector<Woman> list;

        void setName(std::string nameIn);
        std::string getName();
        void setList(Woman manIn);
        std::vector<Woman> getList();
};


class Woman
{
public:
        Woman();

        std::string name;
        std::vector<Man> list;

        void setName(std::string nameIn);
        std::string getName();
        void setList(Man manIn);
        std::vector<Man> getList();
};


Woman::Woman()
{
        name = "undeclared";
}

void Woman::setName(std::string nameIn)
{
        name = nameIn;
}

std::string Woman::getName()
{
        return name;
}

void Woman::setList(Man manIn)
{
        list.push_back(manIn);
}

std::vector<Man> Woman::getList()
{
        return list;
}



Man::Man()
{
        name = "undeclared";
}

void Man::setName(std::string nameIn)
{
        name = nameIn;
}

std::string Man::getName()
{
        return name;
}

void Man::setList(Woman manIn)
{
        list.push_back(manIn);
}

std::vector<Woman> Man::getList()
{
        return list;
}

您似乎在正确的轨道上,要从 2 个不同的地方到达同一个对象,您需要使用引用或指针。

A std::vector<Man> list 是一个容器,它拥有其中的对象。所以 vector 中的每个人都是 vector 拥有的一个单独的对象。当您执行 list.push_back(John); 时,您会将 john 的副本推到向量的后面。

要使其按您希望的方式工作,您需要在向量中存储指针或引用。指针不拥有对象(智能指针除外,但那是另一个话题)它只是指向一个现有对象。

我继续通过让列表(向量)保存指针来让你的代码以最小的变化工作。它看起来像这样。

#include<string>
#include<iostream>
#include<vector>

class Man;
class Woman;


class Man
{
public:
        Man();

        std::string name;
        std::vector<Woman*> list;

        void setName(std::string nameIn);
        std::string getName();
        void setList(Woman* manIn);
        std::vector<Woman*> getList();
};


class Woman
{
public:
        Woman();

        std::string name;
        std::vector<Man*> list;

        void setName(std::string nameIn);
        std::string getName();
        void setList(Man* manIn);
        std::vector<Man*> getList();
};


Woman::Woman()
{
        name = "undeclared";
}

void Woman::setName(std::string nameIn)
{
        name = nameIn;
}

std::string Woman::getName()
{
        return name;
}

void Woman::setList(Man* manIn)
{
        list.push_back(manIn);
}

std::vector<Man*> Woman::getList()
{
        return list;
}



Man::Man()
{
        name = "undeclared";
}

void Man::setName(std::string nameIn)
{
        name = nameIn;
}

std::string Man::getName()
{
        return name;
}

void Man::setList(Woman* manIn)
{
        list.push_back(manIn);
}

std::vector<Woman*> Man::getList()
{
        return list;
}

// main.cpp starts here!

#include "Man.h"

int main()
{
            Woman Andy;
            Man John;

            Andy.setName("Andy");
            John.setName("John");

            Andy.setList(&John);
            John.setList(&Andy);

            std::vector<Man*> list_of_Andy = Andy.getList();
            std::vector<Woman*> list_of_John = John.getList();

            std::cout << "name of persons in the lists " << list_of_Andy.at(0)->getName() << " " << list_of_John.at(0)->getName() << std::endl;
            std::cout << "name of persons " << Andy.getName() << " " << John.getName() << std::endl;


            list_of_Andy.at(0)->setName("JohnWick");
            list_of_John.at(0)->setName("AndySugars");

            std::cout << "name of persons in the lists " << list_of_Andy.at(0)->getName() << " " << list_of_John.at(0)->getName() << std::endl;
            std::cout << "name of persons " << Andy.getName() << " " << John.getName() << std::endl;

            int a;
            std::cin >> a;

            return 0;
}

花时间阅读 good C++ book 或在线查看一些教程以了解该语言的基本功能。指针和引用可能是一个很好的起点。