0

ストーリー: プログラミング クラスのクラスを作成する必要があり、カスタム プロジェクト (スペース マリーン - ええ、私は少しファンです) が進行中です。しかし、簡単には解決できない問題を見つけました。私が重要だと思ういくつかのコードを次に示します。

ヘッダ

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 のメンバーであるクラスです。プロジェクト要件: 1 つのスマート ポインター (ここでは 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 をコンストラクターに「マージ」する際に問題があります。何か案は?

また、コードの改善に関するすべてのアドバイスを歓迎します:)

マット

Ps。初めての投稿はこちら!:D お気楽にどうぞ ^^

編集

コードを整理してくれた user1158692 に感謝します Hansmaad と user1158692 に感謝します。

将来の参考のための最終的なコードは次のとおりです。

ヘッダ

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);
4

2 に答える 2

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 );
于 2013-11-14T15:15:11.347 に答える