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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
雨ガエル
記事: 34
登録日時: 11年前
住所: 新潟
連絡を取る:

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

#1

投稿記事 by 雨ガエル » 10年前

「クラスのコンストラクタで別クラスのポインタを渡し、コピーして使う」という使い方は、オブジェクト指向プログラミングとして正しいのでしょうか。

また、これが正しい場合コピーしたクラスのポインタは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();
    }
};

アバター
雨ガエル
記事: 34
登録日時: 11年前
住所: 新潟
連絡を取る:

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

#2

投稿記事 by 雨ガエル » 10年前

すみませんでした。deleteの問題は自己解決しました。
ポインタのコピーはアドレスをコピーしているだけなので、
deleteすると他の場所で使えなくなるのでdeleteしてはいけませんね。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

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

#3

投稿記事 by beatle » 10年前

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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#4

投稿記事 by h2so5 » 10年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 10年前

シングルトンよりメンテナンス性が高く・可読性の高い良い使い方であるなら問題ないと思います。
実装でどうしようもない部分はあるので、理想のオブジェクト指向じゃないにしても後々困らなかればよいかなって感じで私は作っています。
※ オブジェクト指向を極めたわけでもなんでもないんですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#6

投稿記事 by ISLe » 10年前

インスタンスがnewで作られてない可能性も。

コード:

A a;
B b(&a);

アバター
雨ガエル
記事: 34
登録日時: 11年前
住所: 新潟
連絡を取る:

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

#7

投稿記事 by 雨ガエル » 10年前

beatleさん、h2so5さん、softya(ソフト屋)さん、ISLeさん、回答ありがとうございました。
クラスのポインタをコピーして使うのは問題ないのですね。
deleteすると思い通りの動作をしないことがわかりました。
ありがとうございました。解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る