C++ 为什么可以';我把一个对象推回属于另一个类的对象向量吗?
这里我要做的是将C++ 为什么可以';我把一个对象推回属于另一个类的对象向量吗?,c++,C++,这里我要做的是将Voter添加到属于RegLogBook的vector中,RegLogBook是属于我的Election类的对象。我不知道我做错了什么,没有将投票者对象添加到向量。相关代码如下,我已经删除了所有不必要的部分 选举 class Election { public: Election(); ~Election(); RegLogBook getRegLogBook(); private: RegLogBook* _regLogBook; }; 选
Voter
添加到属于RegLogBook
的vector
中,RegLogBook
是属于我的Election
类的对象。我不知道我做错了什么,没有将投票者
对象添加到向量
。相关代码如下,我已经删除了所有不必要的部分
选举
class Election
{
public:
Election();
~Election();
RegLogBook getRegLogBook();
private:
RegLogBook* _regLogBook;
};
选举
Election::Election()
{
_regLogBook = new RegLogBook();
}
RegLogBook Election::getRegLogBook() {
return *_regLogBook;
}
行车日志
class RegLogBook
{
public:
RegLogBook();
~RegLogBook();
vector<Voter*> getVoterList();
private:
vector<Voter*> _voterList;
};
我把这称为我的主要
RegLogBook::getVoterList()
通过值返回您的\u voterList
。这意味着它复制整个向量并返回它。然后将元素添加到该副本中
要解决此问题,只需更改
vector<Voter*> RegLogBook::getVoterList()
到
感谢轨道上的轻量级比赛指出了这一点
记住-要处理原始对象,而不是它的副本,应该通过引用或指针传递它。默认情况下,您应该更喜欢通过引用传递,除非您有强大的参数来使用指针我认为问题在于您按值返回投票人列表,这意味着将返回投票人列表的副本:
vector<Voter*> RegLogBook::getVoterList() {
return _voterList;
}
将修改本地副本,而不是存储在对象实例中的值
尝试修改代码以返回引用(将返回类型更改为vector&
)
vector&RegLogBook::getVoterList(){
返回voterList;
}
或者,最好返回一个指针:
vector<Voter*>* RegLogBook::getVoterList() {
return &_voterList;
}
vector*RegLogBook::getVoterList(){
返回&_voterList;
}
我更喜欢最后一种选择,因为这使返回值可以修改变得更加明显。从我所看到的情况来看,您的代码甚至不应该编译:您正在使用
new
关键字,但您正在将其返回值保存到委员会
,而不是像您应该的那样保存到委员会*
。如果您使用的是重载的new
运算符,请发布整个代码。必须有1000和一个副本,但我不知道如何查找它们。简而言之,您返回的是一个成员变量的副本,当您在其中插入数据时,原始变量保持不变。offtopic:似乎您应该使用std::vector
而不是std::vector
您以前学过Java或C吗?C++与这些语言之间的相似之处并不好,因为它们在基础层次上的工作方式不同。我建议你learn@SergeyA但我不知道如何查找它们——可能是因为很多问题一开始都是“为什么我的迭代器无效?”,答案是副本是从get…()
函数而不是引用返回的。因此,如果问题开始听起来不像OP,那么很难精确地找到一个副本。你是从书本上学习C++的吗?因为您似乎不需要多态行为,所以请去掉所有指针(Type*
)和动态分配(newtype
)。引用或指针对于返回值具有相同的含义,可以修改,但是指针可以是null,这是错误的,除非返回的值实际上可以是null
您的最后一点非常类似于声称您应该更喜欢通过指针传递参数,而不是通过引用传递参数,所以很明显它们不是复制的。这在所有主要的C++指南中都是令人沮丧的。人们应该更喜欢这里的第一个解决方案(感谢用户463035818指出了原始注释中的输入错误)。大多数时候,改变返回值似乎是个坏主意,一般来说,改变是许多错误的来源。我相信这就是为什么谷歌C++风格指南()不鼓励函数输出参数,但如果需要使用它们,作为指针参数(相对于引用)。这在调用站点清楚地表明参数应该被修改。通过返回指针而不是引用,更明显的是我们没有修改本地副本。
vector<Voter*> RegLogBook::getVoterList()
vector<Voter*>& RegLogBook::getVoterList()
// ^ notice the reference part
void Committee::RegVoter(RegLogBook logs)
void Committee::RegVoter(RegLogBook& logs)
// again notice the reference ^
vector<Voter*> RegLogBook::getVoterList() {
return _voterList;
}
logs.getVoterList().push_back(newVoter);
vector<Voter*>& RegLogBook::getVoterList() {
return _voterList;
}
vector<Voter*>* RegLogBook::getVoterList() {
return &_voterList;
}