2013-11-14 194 views
0

故事是:我必须为我的编程类和我的自定义项目(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); 
+1

我*高度*推荐使用适当的智能指针(如'的std :: unique_ptr')在C++ 11(你显然从'move'调用中使用)。在此之前,还有Boost's。你还没有初始化或设置默认构造函数中的智能指针数据成员。使用构造函数初始值设定项列表是个好主意。您还将指定普通对象指向指针,并且不需要通过非const引用来引用它们。 – chris

+2

'std :: auto_ptr'在C++ 11中被弃用,因为它具有奇怪的复制语义,正如克里斯提出的那样,你应该真的使用'std :: unique_ptr'。 – Jack

+0

那么你可以将'auto_ptr'参数的内容移到你的成员变量'auto_ptr'中两次 - 一次在初始化列表中,一次在构造函数体中。第二次执行此操作时,源将从前一时间处于“空”状态,因此将清除目标成员变量。 –

回答

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>() }; 
} 
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);