通过从类 B 访问类 A 实例来更改该实例的属性
Changing an attribution of an instance of class A via reaching it from class B
我一直在试图弄清楚如何在C++中从另一个类的实例中访问和更改实例的属性。显然,我已经在两者之间进行了复制过程,我不知道如何解决这个问题。
我有两个班级,女人和男人,每个班级都有一个实例:分别是安迪和约翰。两者都有名字,他们的名字是由他们自己的突变体设定的。然后,我为Andy和John创建了一个名为list的向量归因,并将他们纳入彼此的列表中。
现在我想在彼此的列表中找到并更改它们的名称。简而言之:
-
把约翰推回安迪的名单上。
-
通过安迪的名单获取约翰的名字。
-
通过安迪的列表更改约翰的名字(这不仅会影响安迪列表中物品的名称,还会影响约翰本人的名字)。
据我所知,解决方案应该对 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++书或在线查看一些教程以了解该语言的基本功能。指针和引用可能是一个很好的起点。
相关文章:
- C++如何将同一类的实例作为属性
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 返回的指针属性中类实例上的矢量属性消失
- 依赖于类成员属性的类实例成员
- 类实例的C++/向量作为另一个类的属性
- 将成员函数分配给实例成员的属性
- 通过从类 B 访问类 A 实例来更改该实例的属性
- 从另一类获得与属性相同的类实例
- 如何使用结构实例的名称调用其属性
- 正在访问类实例的属性
- 在类中创建公共属性,该类是此类的实例
- 如果我在一个类中有一个静态属性,并创建该类的许多新实例
- 是否可以为现有类的实例绑定新属性,例如 c++ 中的 JavaScript?
- 类属性包括模板类的实例(错误 C3857)
- C++ QML 插件,无法查看C++实例上的属性
- 使用OOP,当您有一个类的实例作为另一类的属性时,如何可能只在第二个类中实例化它
- 在运行时将属性与类实例关联
- 正在获取ostream模板以打印指针列表中的实例属性
- 实现具有自动增量实例属性的类的最python的方式是什么?
- 捕获从c++创建boost::python包装类的实例属性