我一直在试图弄清楚如何从另一个班级中获取和更改实例的归属地' C ++中的实例。我似乎在中间进行了复制过程,我不知道如何解决这个问题。
我有两个班,女人和男人,每个人都有一个主要的实例:安迪和约翰。两者都有名字,他们的名字由他们自己的变异者设定。然后,我为安迪和约翰创建了一个名为列表的矢量属性,并且我已将它们列入彼此的列表中。
现在,我希望在彼此的列表中找到并更改它们的名称。简而言之:
将约翰推回安迪的名单。
通过Andy的名单获取John的名字。
通过Andy的名单更改John的名字(这不仅会影响Andy的名单中的项目名称,还会影响John的名字 - 自己)。
据我所知,解决方案应该使用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.
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;
}
答案 0 :(得分:0)
您似乎走在正确的轨道上,从2个不同的地方到达同一个对象,您需要使用引用或指针。
std::vector<Man> list
是拥有其中对象的容器。因此,向量中的每个人都是向量所拥有的独立对象。当你执行list.push_back(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或在线查看一些教程,了解该语言的基本功能。指针和参考可能是一个很好的起点。