0

これが私の問題です。

Class MClass {

public:

    void Add(OtherClass* objects) {
        _objects = objects;
    }

private:

    OtherClass* _objects;
}

//otherfile.cpp


void Setup() {

    MClass myObj;
    OtherClass obj[NUMBER_OF_OBJECTS];

    //obj initialization here
    //...

    myObj.Add(obj);
}

関数本体の終了後に *obj が減少するため、RT エラーが発生します。

しかし、どうすればこれを有効にできますか?

オブジェクトを他のクラスに割り当てる前に、最初にオブジェクトを初期化するのが好きです。

編集

ここではストレージ クラスなどを使用したくありません。使用するのに非常にコストがかかるため、生の配列が必要なだけです。その機能は、ここでの問題を軽減しません。

では、生の配列スタイルでそれを行うにはどうすればよいでしょうか?

4

4 に答える 4

2
Class MClass {
public:
    void Add(std::vector<OtherClass> objects) {
        _objects = std::move(objects);
    }
private:
    std::vector<OtherClass> _objects;
}

//otherfile.cpp
void Setup() {
    MClass myObj;
    std::vector<OtherClass> obj(NUMBER_OF_OBJECTS);
    myObj.Add(std::move(obj));
}
于 2013-02-25T13:08:18.933 に答える
1

何をしようとしているのかは完全には明らかではありませんが、ポインターの代わりにオブジェクトのコレクションを保存できます。

class MClass 
{
 public:
    void Add(const std::vector<OtherClass>& objects) {
        objects_ = objects;
    }
    void Add(std::vector<OtherClass>&& objects) {
        objects_ = std::move(objects);
    }
 private:
    std::vector<OtherClass> objects_;
};

それから

void Setup() 
{    
    MClass myObj;
    std::vector<OtherClass> obj(NUMBER_OF_OBJECTS);
    //obj initialization here
    //...
    myObj.Add(std::move(obj)); // move obj's contents onto myObs's objects.
}
于 2013-02-25T13:08:05.333 に答える
1

生の配列の使用をやめ、 または のいずれstd::vectorかを使用しますstd::array。そうすれば、もう心配する必要はありません。


本当に手動で行いたい場合は、コピーも手動で行う必要があります。eg std::vectorandを使用するとstd::moveより効果的ですが、次のようになります。

Class MClass {
public:
    MClass()
        : _objects(nullptr), _count(0)
    {}

    MClass(const MClass& other)
        : _objects(nullptr), _count(0)
    {
        Add(other._objects, other._count);
    }

    ~MClass()
    {
        if (_objects != nullptr)
            delete [] _objects;
    }

    void Add(const OtherClass* objects, const size_t count)
    {
        if (_objects != nullptr)
            delete [] _objects;

        _objects = new [count];

        for (size_t i = 0; i < count; i++)
            _objects[i] = objects[i];

        _count = count;
    }

    MClass& operator=(const MClass& other)
    {
        Add(other._objects, other._count);
    }

private:
    OtherClass* _objects;
    size_t _count;
};

// ...

myObj.Add(obj, NUMBER_OF_OBJECTS);

ご覧のとおり、コードが多くなるため、追跡やデバッグが難しくなり、エラーの可能性も高くなります。そして、上で言ったほど「効果的」ではありません。

于 2013-02-25T13:08:33.027 に答える
1

あなたの例では、ポインターをローカル配列に格納します。メソッドが終了すると、配列はスコープ外になり、存在しなくなります。

これが理由です。ポインタはもう有効ではありません。これを解決したい場合は、C++ の変数のスコープについて学んでください。

于 2013-02-25T13:13:54.403 に答える