Конструктор C ++ не будет передавать строку - конструктор не определен - PullRequest
1 голос
/ 05 декабря 2011

Я пытаюсь создать объект "Player" внутри "PlayerManager" и получаю сообщение об ошибке в 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 & inконструктор, но выдает ту же ошибку.

Буду признателен за любую помощь, часами ищите ответ.Извиняюсь за неправильную разметку, так как я впервые задаю вопрос.

1 Ответ

9 голосов
/ 05 декабря 2011

Класс std::vector требует, чтобы класс, с которым вы его используете, имел конструктор по умолчанию 1 . Вам нужно будет предоставить один для вашего класса.

Если вы действительно не хотите предоставлять его, вы можете присвоить экземпляр вашего класса vector в вызове его конструктора, чтобы он использовал этот экземпляр вместо попытки создания по умолчанию:

vector v(initialsize, Player("")); // or you can pass whatever string you want the default item to have

Если вектор, который вы используете для хранения Player s, является переменной-членом, вам нужно передать ему значение по умолчанию Player для использования в списке инициализатора:

PlayerManager::PlayerManager() : players(initialsize, Player("")) { // assuming the vector is named players
    .... 
}

<ч /> 1 Как R. Мартиньо Фернандес и Kerrek SB указали в комментариях, конструктор по умолчанию требуется только для этого конкретного конструктора vector (тот, который принимает начальный размер, а когда вы не даете это экземпляр по умолчанию) и функция-член resize при вызове с одним аргументом. Если вы используете конструктор, который принимает итераторы или const Allocator&, или если вы используете resize со вторым аргументом, то вам не нужен DC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...