【发布时间】:2013-08-24 09:39:39
【问题描述】:
这可能很简单,但我有点难过。我的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();-部分)之类的建议。我是否违反了the rule of three(顺便说一句,我还没有完全理解)?如果有人能指出正确的方向,我将不胜感激!
【问题讨论】:
-
@Zak Howland 的 cmets 是错误的。他描述了大约 10 年前的工作方式,但是 (A) 现在
std::string::operator=需要进行深拷贝,并且 (B) 它总是需要像一样进行深拷贝。 -
您实际上根本不需要复制构造函数——默认的会做正确的事情。如果你有它,你不需要调用
c_str()(它们只是让它变得不那么健壮),你应该初始化成员而不是分配给它们。但尽管如此,我看不出有任何理由说明它不应该像现在这样工作。你得到什么输出? -
它(咳嗽)在我的机器上工作。
标签: c++ copy-constructor stdstring