0

我是 C++ 初学者(没有以前的编程经验)。我正在编写一个基于文本的游戏,并且我有一个核心模块来开发游戏的“人口”。到目前为止,我已经确定了人口增长率(基于预定义的出生率和死亡率),我现在要做的是为每个公民创建一个独特的对象。

我创建了Citizen类,并使用向量来生成初始的公民群体:

vector<Citizen> myCitizens (100);

有一个函数可以为这 100 个公民中的每一个设置几个初始值。那里没有问题。

该程序每“年”都会计算该年的出生和死亡人数。我想根据那一年的出生人数将新对象添加到myCitizens向量中。

我被困在这个功能上:

宣言:

int new_citizens(int newBirths);

定义:

int new_citizens(int newBirths)
{
myCitizens.push_back(newBirths);
}

编译器构建消息:

error: no matching function for call to 'std::vector<Citizen>::push_back(int&)'
note: candidate is:
note: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = Citizen;  _Alloc = std::allocator<Citizen>; std::vector<_Tp, _Alloc>::value_type = Citizen]

我已经搜索了这个问题,查看了文档,搞砸了更改类型无济于事。我已经编译了 push_back 确实有效的示例。我认为在通过向量创建对象时,我错过了一个基本的难题。

我当时的假设是我声明类型信息错误或没有正确地将信息传递给向量。我会继续努力。任何正确方向的指针将不胜感激!

谢谢,

最优

4

3 回答 3

4
vector<Citizen> myCitizens (100);

这定义了一个由 100 个类对象组成的vector命名,每个对象都用. 然后,如果我正确地知道您想要做的是调整向量的大小以包含对象的总数,您可以这样做:myCitizensCitizenCitizen()newBirthsCitizen

int new_citizens(int newBirths)
{
    // first we need to remove items, after this size() is 0
    myCitizens.clear();

    // and populate vector now
    for(unsigned int i = 0; i<newBirths; i++)
        myCitizens.push_back(Citizen());
}

你也可以使用std::vector::resize来实现这一点:

int new_citizens(int newBirths){
    myCitizens.resize(newBirths);
}

注意:使用 resize容器的大小调整为您在调用此函数时指定的大小:如果当前大小大于您在调用中指定的大小,则容器大小将减小,如果当前大小小于,则容器大小将resize增加newBirths

但是,如果您想这个数量的新项目添加到现有向量中,那么您可以这样做:

int new_citizens(int newBirths)
{
    // just add new items
    for(unsigned int i = 0; i<newBirths; i++)
        myCitizens.push_back(Citizen());
}

或者再次使用调整大小:

int new_citizens(int newBirths){
    myCitizens.resize(myCitizens.size() + newBirths);
}
于 2013-09-03T00:56:14.433 回答
0

您定义了向量来保存 Citizen 类的对象

vector<Citizen>

函数 push_back() 接受 value_type 类型的对象,在您的情况下是 Citizen。

void push_back (const value_type& val);

您可以在构造函数中传递一个数字

vector<Citizen> myCitizens (100);

因为有一个接受数字的构造函数:

explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());

为了使您的功能正常工作,您可以编写一个循环:

for (int i = 0; i < newBirths; ++i)
{
    myCitizens.push_back(Citizen());
}

正如克里斯指出的那样,您可以使用 resize() 函数。事实上,这会比循环更优雅。

myCitizens.resize(myCitizens.size() + newBirths)

std::vector resize()

于 2013-09-03T00:53:20.090 回答
0

如果你想添加 newBirths 新闻公民,那么做一个循环,就像这个

int new_citizens(int newBirths)
{
    for(unsigned int it = 0; it<newBirths; ++it)
        myCitizens.push_back(Citizen()); // <-- uses the default constructor
}
于 2013-09-03T00:54:11.477 回答