У меня есть очень технический вопрос, я работал с 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 делает это без меня, заранее спасибо (если Вы не хотите отвечать на мой вопрос, по крайней мере, дают мне некоторую ссылку с информацией), заранее спасибо
Вот "правильная" реализация того, что у вас есть сейчас:
#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
справится с этим за вас.
Перейдите сюда 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);
}
}
Я предполагаю, что вы используете строковый класс STL (std :: string).
Строковые объекты создаются при автоматическом создании Player с использованием конструктора по умолчанию std :: string.
Когда вы говорите: strFirstName = firstName, вы вызываете конструктор копирования , который заменяет объект в памяти. Старайтесь не думать об указателях, C ++ сводит их к минимуму.
Таким образом, вам не нужно использовать malloc при использовании strFirstName = "blah".
(Кстати, я не понимаю, о чем вы говорите с "новой учетной записью")
Почему вы хотите выделить память в конструкторе? В опубликованном коде нет ничего, что делало бы выделение памяти обязательным.
Со стандартными контейнерами STL, такими как список, строка и т. Д., Вы можете или не захотите использовать собственные распределители памяти. Типичное объявление в вашем случае - list
. Если вы вставляете объекты Player в список, они будут созданы копированием [так что предоставьте правильный конструктор копирования, если вы балуетесь указателями внутри своего класса]
Если вы хотите настраиваемое выделение памяти для вашего списка или строки, объявление будет иметь вид list
и т. д.
Стандарт предоставляет распределитель, который внутренне использует глобальные операторы, которые используются по умолчанию везде, где требуется распределитель. Посмотрите стандарт C ++, раздел 20.4.1. Публичный интерфейс хорошо описан.