通过从类 B 访问类 A 实例来更改该实例的属性

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

本文关键字:实例 属性 访问      更新时间:2023-10-16

我一直在试图弄清楚如何在C++中从另一个类的实例中访问和更改实例的属性。显然,我已经在两者之间进行了复制过程,我不知道如何解决这个问题。

我有两个班级,女人和男人,每个班级都有一个实例:分别是安迪和约翰。两者都有名字,他们的名字是由他们自己的突变体设定的。然后,我为Andy和John创建了一个名为list的向量归因,并将他们纳入彼此的列表中。

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

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

  2. 通过安迪的名单获取约翰的名字。

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

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

输出:

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.

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

类.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 个不同的地方访问同一对象,您需要使用引用或指针。

std::vector<Man> list是拥有其中对象的容器。因此,向量中的每个人都是向量拥有的独立对象。当你这样做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;
}

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