故事是:我必须为我的编程课和我的自定义项目(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”和“Bron”是主要类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 - Stats,P - armor,B-weapon class
这个小东西有问题,称为P2,它应该是一个装甲的auto_ptr。我先前已经宣布了盔甲对象P2。 我有问题“将”auto_ptr“合并”到我的构造函数中。有什么想法吗?
此外,欢迎所有关于改进我的代码的建议:)
马特
聚苯乙烯。我的第一篇帖子! :D对我很轻松^^
修改
感谢user1158692整理我的代码 感谢Hansmaad和user1158692 我希望我能为这个问题做出正确的答案,因为它们都帮助我处理它;)
以下是未来参考的最终代码:
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);
答案 0 :(得分:2)
您只需将auto_ptr
传递给构造函数即可。它会将所有权转移到副本。
但是,std::auto_ptr
已弃用,应替换为std::unique_ptr
。
struct A {};
struct B
{
std::auto_ptr<A> a;
B(std::auto_ptr<A> a) : a(a)
{
}
};
struct C
{
std::unique_ptr<A> a;
C(std::unique_ptr<A> a) : a(std::move(a))
{
}
};
int main()
{
std::auto_ptr<A> a{ new A };
B b{ a };
C c{ std::make_unique<A>() };
}
答案 1 :(得分:0)
如果装甲对象要分享SpaceMarine的生命周期(并且智能指针暗示它是)那么为什么它根本就在堆上,而不是堆栈?
尽管如此,如果这是你的方式,那么考虑像这样定义类和构造函数(为简洁起见,省略了一些参数等等)::
声明:
class SpaceMarine
{
public:
SpaceMarine(Pancerz* armor);
private:
std::unique_ptr<Pancerz> armor_;
};
实现:
SpaceMarine::SpaceMarine( Panzerc* armor )
: armor_(armor)
{
}
叫做:
SpaceMarine obj( new Panzerc() );
或
Panzerc* ptr = new Panzerc();
.
.
SpaceMarine obj( ptr );