故事是:我必须为我的编程类和我的自定义项目(Space Marine - 是的,我有点迷)正在进行一个类。但是我发现了一个我无法简单解决的问题。下面是一些代码,我认为是很重要的:构造函数中的智能指针
HEADER
class SpaceMarine
{
public:
...
SpaceMarine(); // default constructor
SpaceMarine(std::string name,
unsigned int rang,
Statystyki& stats,
std::auto_ptr<Pancerz> armor, Bron& weapon);
private:
std::string name_;
unsigned int ranga_;
Statystyki* stats_;
std::auto_ptr<Pancerz> armor_;
Bron* weapon_;
Experience experience_;
只是要清楚:“Statystyki”,“Pancerz”和“布龙”是在主类SpaceMarine的成员类。项目需求:我必须制作一个智能指针(这里是auto_ptr)。
.CPP
SpaceMarine::SpaceMarine()
{
name_ = "John";
stats_ = new Statystyki();
weapon_ = new Bron();
std::auto_ptr<Pancerz> armor_(new Pancerz());
ranga_ = 0;
}
SpaceMarine::SpaceMarine(std::string name,
unsigned int rang,
Statystyki& stats,
std::auto_ptr<Pancerz> armor, Bron& weapon)
: armor_(std::move(armor))
{
name_ = name;
ranga_ = rang;
stats_ = stats;
armor_ = std::move(armor);
weapon_ = weapon;
}
现在,那里的问题开始: 这是 “的main.cpp” 文件的一部分:
SpaceMarine SM1;
SpaceMarine SM2("Azrael", 3, S2, **P2** , B2);
//的S - 统计,P - 铠甲, B武器类
这个小东西有个问题,叫P2,它应该是一个auto_ptr来装甲。我有先前宣布的防具对象P2。 我有问题“合并”auto_ptr到我的构造函数。有任何想法吗?
此外,关于提高我的代码的所有建议都欢迎:)
马特
诗篇。我的第一篇文章! :d悠着点对我^^
编辑
感谢user1158692的整理我的代码 感谢Hansmaad和user1158692 我希望我能适合这个probleme使双方你的答案,既帮助了我对付它;)
下面是未来refrence最终代码:
HEADER
SpaceMarine(std::string name,
unsigned int rang,
Statystyki& stats,
Pancerz& armor,
Bron& weapon);
.CPP
SpaceMarine(std::string name,
unsigned int rang,
Statystyki& stats,
Pancerz& armor,
Bron& weapon);
{
name_ = name;
ranga_ = rang;
stats_ = &stats;
std::unique_ptr<Pancerz> armor_(&armor);
weapon_ = &weapon;
}
//和例子main.cpp中
Bron B2("Chainsword" , 0, 6);
Pancerz P2("Power armor", 12);
Statystyki S2(6,6,4,8,20);
SpaceMarine SM2("Azrael", 3, S2, P2 , B2);
我*高度*推荐使用适当的智能指针(如'的std :: unique_ptr')在C++ 11(你显然从'move'调用中使用)。在此之前,还有Boost's。你还没有初始化或设置默认构造函数中的智能指针数据成员。使用构造函数初始值设定项列表是个好主意。您还将指定普通对象指向指针,并且不需要通过非const引用来引用它们。 – chris
'std :: auto_ptr'在C++ 11中被弃用,因为它具有奇怪的复制语义,正如克里斯提出的那样,你应该真的使用'std :: unique_ptr'。 – Jack
那么你可以将'auto_ptr'参数的内容移到你的成员变量'auto_ptr'中两次 - 一次在初始化列表中,一次在构造函数体中。第二次执行此操作时,源将从前一时间处于“空”状态,因此将清除目标成员变量。 –