繁体   English   中英

构造函数中的智能指针

[英]smart pointer in constructor

故事是:我必须为我的编程课和我的自定义项目(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“合并”到我的构造函数中。 有任何想法吗?

此外,欢迎所有关于改进我的代码的建议:)

马特

PS。 我的第一篇帖子! :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);

您只需将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>() };
}

如果装甲对象要共享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 );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM