我试图在“PlayerManager”中创建一个“Player”对象,我在VS2010中收到错误:
Error 1 error C2512: 'Player::Player' : no appropriate default constructor available c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory 631 1 Server
Player.h:
#ifndef _PLAYER_H
#define _PLAYER_H
#include <iostream>
#include <string>
using namespace std;
class Player
{
public:
Player(const string &name);
~Player(void);
private:
string name_;
};
#endif
这是Player.cpp中的构造函数:
Player::Player(const string &name)
{
}
PlayerManager.h:
'#ifndef _PLAYERMANAGER_H
#define _PLAYERMANAGER_H
#include <string>
#include <vector>
#include <iostream>
#include "Player.h"
using namespace std;
class PlayerManager
{
public:
PlayerManager(void);
~PlayerManager(void);
private:
vector<Player> players;
};
#endif'
这是我在PlayerManager.cpp中创建对象的地方:
PlayerManager::PlayerManager(void)
{
Player test("Hello");
players.resize(1000);
for(int i=0; i < 960; i++){
players.push_back(test);
}
}
我不明白为什么它忽略字符串“Hello”,我尝试创建一个字符串对象但是给出了同样的错误。
我也试过没有添加const&amp;在构造函数中,但给出相同的错误。
任何帮助将不胜感激,花几个小时寻找答案。如果布局不正确,请道歉,因为这是我第一次提问。
答案 0 :(得分:9)
类std::vector
要求您使用它的类具有默认构造函数 1 。你需要为你的班级提供一个。
如果你真的不想提供一个,你可以在它的构造函数调用中将类的实例赋予vector
,这样它就会使用该实例而不是尝试默认构造一个:< / p>
vector v(initialsize, Player("")); // or you can pass whatever string you want the default item to have
如果您用来存储Player
的矢量是成员变量,则需要将其传递给默认Player
以在初始化列表中使用:
PlayerManager::PlayerManager() : players(initialsize, Player("")) { // assuming the vector is named players
....
}
<小时/> 1 As R. Martinho Fernandes 和 Kerrek SB 在评论中指出,
vector
的这个特定构造函数只需要一个默认构造函数(一个初始大小的构造函数,当你当使用单个参数调用时,不要给它一个默认实例)和成员函数resize
。如果您使用带有迭代器或const Allocator&
的构造函数,或者如果您将resize
与第二个参数一起使用,那么您不需要DC。