0

想像してみてください、私はいくつかのクラスを持っています:

class MyClass{
    public:
        MyClass(unsigned int N): a(new double[N]){};
        ~MyClass(){delete[] a;};

    private:
         double* a;
}

別のクラスでは、このクラスへのポインターを使用します。

class MyOtherClass{
    public:
        MyOtherClass(unsigned int N):p(new MyClass(N)){};
        ~MyOtherClass(){delete p;};

        MyClass* get_MyClass(){return p;};

    private:
        MyClass *p;
}

次に、主に MyOtherClass に含まれる MyClass を取得する必要があります

int main(){
    MyOtherClass moc(1e100);
    MyClass mc;

    mc <-> moc.get_MyClass();
}

<->私が立ち往生しているところです。mcそれが p が指すものになりたいのですが、(巨大な)静的配列をコピーする必要はありません。この変換を効率的に行う方法はありますか?

編集

あなたの答えに感謝しますが、私は何かを正確にします。MyClass のコピーの時間のかかる部分は静的配列のコピーに由来するため、次のようなことができると思いました。

class MyClass{
    public:
        MyClass(unsigned int N): a(new double[N]),del(true){};
        MyClass(MyClass* mc): a(mc.get_a()),del(true){};
        ~MyClass(){if(del){delete[] a;}};

        double* get_a(){
            del = false;
            return a;
        }

    private:
         double* a;
         bool del;
}

メインで:

int main(){
    MyOtherClass moc(1e100);
    MyClass mc(moc.get_MyClass());
}

しかし、メモリリークがあるかどうかはわかりません...

4

4 に答える 4

3

使用参照:

int main(){
    MyOtherClass moc(1e100);
    MyClass& mc = *moc.get_MyClass();
}

参照を使用すると、コピーを回避しながら、ポインター構文の使用を回避できます。

于 2013-06-26T12:45:07.783 に答える
1

コンテンツを破棄したい場合pは、 のムーブ コンストラクターを記述しMyClassます。

一般に、あなたのように生のポインターを保存することは、一般的に問題があります。代わりに使用vector<double>すると、タスク全体がはるかに簡単になります。このアプローチでは、ポインタの不必要な使用は問題を追加するだけだからです。

それが私がそれをする方法です:

class MyClass{
    std::vector<double> a;
public:
    MyClass(unsigned int N): a(N) { }
    // no destructor!
};

class MyOtherClass{
    MyClass p;
public:
    MyOtherClass(unsigned int N) : p(N) {};
    // no destructor!!

    MyClass& getMyClass() { return p; };
}

これで、参照であるため、コピーせずにgetMyClassnew を初期化するために使用できないことがはっきりとわかります。MyClassただし、後で MyOtherClass を使用する必要がないと確信している場合、またはそのデータを「盗む」だけの場合は、次のように安全に削除できるはずmoveですMyOtherClass

MyClass(MyClass&& other) : a(std::move(other.a)) {
    // now, I am not sure what will be left in other.a, but you can clean it up
    // (you can because it's in valid, only undefined state)
    other.a = std::vector<double>();
}

データを盗むことに興味はないが、単にアクセスしたい場合は、他の人が提案したように参照を使用してください。

于 2013-06-26T12:40:24.757 に答える
0

の戻り値の型を変更する必要があります

MyClass* get_MyClass(){return p;};

MyClass& get_MyClass(){return p;};

あなたが説明したことは、この機能の主な使用法と思われるためです。

次に、次のようにインスタンスを取得します。

MyClass& mc = moc.get_MyClass ();
于 2013-06-26T12:45:01.300 に答える