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