STL в C++, как это работает

У меня есть очень технический вопрос, я работал с C, и теперь я изучаю C++, если у меня есть, например, этот класс

class Team {
private:
   list<Player> listOfPlayers;
public:
    void addPlayer(string firstName, string lastName, int id) {
        Player newPlayer(string firstName, string lastName, int id);
            listOfPlayers.push_back(Player(string firstName, string lastName, int id));
    }
};

это - объявление Плеера:

class Player{
private:
    string strLastName;      
    string strFirstName;     
    int nID;                
public:
    Player(string firstName, string lastName, int id);

};

и это - мой конструктор Плеера:

Player::Player(string firstName, string lastName, int id){
    nId = id;
    string strFirstName = firstName;
    string strLastName = lastName;
}

таким образом, мой вопрос состоит в том, когда я вызываю функцию addPlayer что точно продолжает программу,

в моем конструкторе Учетной записи делают я должен выделить новую память для new Player(причина в C я всегда использую malloc), for strFirstName and strLastName, или конструктор строки Учетной записи и STL делает это без меня, заранее спасибо (если Вы не хотите отвечать на мой вопрос, по крайней мере, дают мне некоторую ссылку с информацией), заранее спасибо

1
задан helloWorld 17 June 2010 в 07:37
поделиться

4 ответа

Вот "правильная" реализация того, что у вас есть сейчас:

#include <list>
#include <string>

class Player
{ 
private: 
    std::string strLastName;       
    std::string strFirstName;      
    int nID;                 
public:
    // You should pass std::strings to functions by const reference.
    // (see Kirill V. Lyadvinsky's comment to OP's question)
    Player(const std::string& firstName, const std::string& lastName, int id); 
};

// What follows after the colon is called the initializer list.
Player::Player(const std::string& firstName, const std::string& lastName, int id)
    : strFirstName(firstName), strLastName(lastName), nID(id) {}

class Team
{ 
private: 
    std::list<Player> listOfPlayers; 
public: 
    void addPlayer(const std::string& firstName,
        const std::string& lastName, int id)
    { 
        // Constructs a Player instance and adds it to the list.
        listOfPlayers.push_back(Player(firstName, lastName, id)); 
    } 
};

Функция списка push_back() выделяет новый узел, который содержит экземпляр Player и указатели на другие узлы, поэтому у вас есть своего рода «цепочка» экземпляров Player.

Что касается вашего вопроса о Account, если у вас есть это:

class Account
{
private:
    std::string strFirstName;
    std::string strLastName;
};

Тогда вам не нужно беспокоиться о выделении/освобождении памяти для массивов символов, потому что std::string справится с этим за вас.

2
ответ дан 2 September 2019 в 23:42
поделиться

Перейдите сюда http://cplusplus.com

В конструкторе вы должны использовать список инициализации.

При вызове методов или присвоении значений существующим переменным вы не должны писать тип. Таким образом, вы всегда создаете новые переменные.

Пример:

private:
   list<Player> listOfPlayers;
public:
    void addPlayer(string firstName, string lastName, int id) {
        Player newPlayer(string firstName, string lastName, int id);
    }
}

должно быть

private:
   list<Player> listOfPlayers;
public:
    void addPlayer(string firstName, string lastName, int id) {
        Player newPlayer(firstName, lastName, id);
    }
}
0
ответ дан 2 September 2019 в 23:42
поделиться

Я предполагаю, что вы используете строковый класс STL (std :: string).

Строковые объекты создаются при автоматическом создании Player с использованием конструктора по умолчанию std :: string.

Когда вы говорите: strFirstName = firstName, вы вызываете конструктор копирования , который заменяет объект в памяти. Старайтесь не думать об указателях, C ++ сводит их к минимуму.

Таким образом, вам не нужно использовать malloc при использовании strFirstName = "blah".

(Кстати, я не понимаю, о чем вы говорите с "новой учетной записью")

0
ответ дан 2 September 2019 в 23:42
поделиться

Почему вы хотите выделить память в конструкторе? В опубликованном коде нет ничего, что делало бы выделение памяти обязательным.

Со стандартными контейнерами STL, такими как список, строка и т. Д., Вы можете или не захотите использовать собственные распределители памяти. Типичное объявление в вашем случае - list . Если вы вставляете объекты Player в список, они будут созданы копированием [так что предоставьте правильный конструктор копирования, если вы балуетесь указателями внутри своего класса]

Если вы хотите настраиваемое выделение памяти для вашего списка или строки, объявление будет иметь вид list и т. д.

Стандарт предоставляет распределитель, который внутренне использует глобальные операторы, которые используются по умолчанию везде, где требуется распределитель. Посмотрите стандарт C ++, раздел 20.4.1. Публичный интерфейс хорошо описан.

0
ответ дан 2 September 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: