0

C++ クラス メンバ関数が引数としてオブジェクトへのポインタを必要とする場合、参照渡しは悪い習慣と見なされますか?

たとえば、次のコードは機能しますが、参照渡しがないと危険なコードになり、実行時に壊滅的なエラーが発生します。

class ClassA
{
public:
    void SetPointer(const ClassB& classb) // Remove 1 ampersand and serious errors will occur
    {
        if(ptr_to_classb == nullptr) // Initialized to nullptr in constructor
            ptr_to_classb = &classb;
        else
            throw(...); // Throw some error
    }

private:
    ClassB* ptr_to_classb;
}

値渡しで引数のコピーが作成された場合、後で逆参照するときに悲惨な結果になることを考慮してください。

別の方法は次のとおりです。

class ClassA
{
public:
    void SetPointer(const ClassB* const classb)
    {
        if(ptr_to_classb == nullptr) // Initialized to nullptr in constructor
            ptr_to_classb = (ClassB*)(classb);
        else
            throw(...); // Throw some error
    }

private:
    ClassB* ptr_to_classb;
}

私は一貫性が好きで、最初のタイプにデフォルト設定されていますが、2 番目の形式の方がより良い方法であると考えられます。これは事実ですか?

4

3 に答える 3

1

どちらのアプローチも正しくて問題ありませんが、参照変数はポインターとは異なり、初期化時にのみ値を割り当てることができるため、おそらくポインターを使用する方がよいでしょう。同じポインターを使用して、後で別のクラス オブジェクトを渡すことができます。

于 2014-08-10T11:28:02.800 に答える
1

私の見解では、メソッドに null 引数を渡すことが有効な場合 (つまり、メソッドが実行するロジックが null ポインターで有効である場合) は、ポインターを使用します。引数が null であってはならない場合は、参照を使用してください。

あなたの場合、これは ClassA::ptr_to_classb が null であることが有効かどうかによって異なります。ptr_to_classb が既に設定されている場合にスローする (つまり、それが指すものを変更したくない) ため、代わりに参照を格納し、それを ClassA のコンストラクターに渡し、ClassA::SetPointer を取り除くことを検討することもできます。

参照とポインタについては、他にもいくつかの意見があります

于 2014-08-10T11:30:49.683 に答える
0

メソッドはオブジェクトのフィールドを設定するだけなので、フィールドのタイプ(参照ではなくポインター)を使用したいようです。あなたが書いた

私は一貫性が好きで、最初のタイプにデフォルト設定されています

これは、「可能な場合は参照を使用し、それ以外の場合はポインターを使用する」という規則を指していると思います。あなたのケースはこの規則の例外だと思います。

void do_stuff(ClassA& object)

通常、「オブジェクトに何かをして、それを忘れる」ことを意味しますが、あなたの場合は異なります。

于 2014-08-10T11:53:05.973 に答える