ページ 11

C++ クラスのコンストラクタで別クラスのポインタを渡して使う

Posted: 2013年8月01日(木) 11:08
by 雨ガエル
「クラスのコンストラクタで別クラスのポインタを渡し、コピーして使う」という使い方は、オブジェクト指向プログラミングとして正しいのでしょうか。

また、これが正しい場合コピーしたクラスのポインタはdeleteする必要はあるのでしょうか。

コード:

class A
{
public:
    void funcA(void)
    {
        // 省略
    }
};

class B
{
private:
    A *a;
public:
    B(A *a)
    {
        this->a = a;
    }
    ~B(void)
    {
        delete a;
    }
    void funcB(void)
    {
        a->funcA();
    }
};

Re: C++ クラスのコンストラクタで別クラスのポインタを渡して使う

Posted: 2013年8月01日(木) 11:22
by 雨ガエル
すみませんでした。deleteの問題は自己解決しました。
ポインタのコピーはアドレスをコピーしているだけなので、
deleteすると他の場所で使えなくなるのでdeleteしてはいけませんね。

Re: C++ クラスのコンストラクタで別クラスのポインタを渡して使う

Posted: 2013年8月01日(木) 11:29
by beatle
雨ガエル さんが書きました:「クラスのコンストラクタで別クラスのポインタを渡し、コピーして使う」という使い方は、オブジェクト指向プログラミングとして正しいのでしょうか。
「クラスのコンストラクタで別クラスのポインタを渡し、コピーして使う」こと自体は問題はありません。
たとえばJavaのBufferedReaderクラスのコンストラクタにはReader型のオブジェクトを渡します(Javaの場合は参照ですがポインタと同じようなものです)

オブジェクト指向な設計として適切かどうかは、クラスの詳細が分からないと議論できません。

Re: C++ クラスのコンストラクタで別クラスのポインタを渡して使う

Posted: 2013年8月01日(木) 11:30
by h2so5
雨ガエル さんが書きました:「クラスのコンストラクタで別クラスのポインタを渡し、コピーして使う」という使い方は、オブジェクト指向プログラミングとして正しいのでしょうか。
適切かどうかは場合によります。
雨ガエル さんが書きました: また、これが正しい場合コピーしたクラスのポインタはdeleteする必要はあるのでしょうか。
メモリ管理をポインタを持っているクラスに任せるという設計であれば、deleteする必要があります。
つまり、AクラスのインスタンスがBのポインタの独占的な所有権を持っている場合、ということになります。

ただし、Aのデストラクタでdeleteするとインスタンスをコピーしたときにコピー先のインスタンスがdeleteされたポインタを持ってしまうので、コピーコンストラクタでBのインスタンスを複製するか、参照カウント方式などで管理する必要があります。

Re: C++ クラスのコンストラクタで別クラスのポインタを渡して使う

Posted: 2013年8月01日(木) 12:03
by softya(ソフト屋)
シングルトンよりメンテナンス性が高く・可読性の高い良い使い方であるなら問題ないと思います。
実装でどうしようもない部分はあるので、理想のオブジェクト指向じゃないにしても後々困らなかればよいかなって感じで私は作っています。
※ オブジェクト指向を極めたわけでもなんでもないんですけどね。

Re: C++ クラスのコンストラクタで別クラスのポインタを渡して使う

Posted: 2013年8月01日(木) 17:11
by ISLe
インスタンスがnewで作られてない可能性も。

コード:

A a;
B b(&a);

Re: C++ クラスのコンストラクタで別クラスのポインタを渡して使う

Posted: 2013年8月01日(木) 18:41
by 雨ガエル
beatleさん、h2so5さん、softya(ソフト屋)さん、ISLeさん、回答ありがとうございました。
クラスのポインタをコピーして使うのは問題ないのですね。
deleteすると思い通りの動作をしないことがわかりました。
ありがとうございました。解決しました。