Это, наверное, нелегко, но я немного в тупике. У меня были проблемы с моим vectors not behaving nicely, и теперь похоже, что я нашел преступника. Ниже приведена моя версия Player
.Почему мой конструктор копий не работает?
class Player {
private:
std::string _firstName;
std::string _lastName;
public:
Player(std::string firstName, std::string lastName) {
_firstName = firstName;
_lastName = lastName;
};
Player(const Player& otherPlayer) {
_firstName = otherPlayer._firstName.c_str();
_lastName = otherPlayer._lastName.c_str();
std::cout << "Created " << _firstName << " " << _lastName << std::endl; // Why doesn't _firstName and _lastName contain anything?
};
std::string GetName() { return _firstName + " " + _lastName; };
};
int main(int argc, const char * argv[])
{
Player player1 = Player("Bill", "Clinton");
Player player2 = Player(player1);
std::cout << "Player: " << player2.GetName() << std::endl;
return 0;
}
Выходной сигнал является скудным Player:
. Я не уверен, почему мой конструктор копий не делает то, что я хочу, чтобы это сделать, в частности, в свете рекомендаций, таких как this (комментарий Zac Howland учитывает c_str();
-part). Я нарушаю the rule of three (что, кстати, я до сих пор не полностью опустил голову)? Я был бы очень благодарен, если бы кто-нибудь мог указать мне в правильном направлении!
@ Замечания Zak Howland неверны.Он описывает, как все работало ~ 10 лет назад, но (A) теперь требуется 'std :: string :: operator =', чтобы сделать глубокую копию, и (B) всегда требовалось _act like_ глубокую копию. –
[Я добавил '#include' и '#include '] (http://ideone.com/DjrNcp) –
Derek
На самом деле вам вообще не нужен конструктор копирования - по умолчанию он пойдет правильно. Если у вас это есть, вам не нужны вызовы 'c_str()' (они просто делают его менее надежным), и вы должны инициализировать членов, а не назначать им. Но, несмотря на это, я не вижу причин, почему он не должен работать так, как он есть. Какой результат вы получаете? –