0

例えば

struct A
{
    void foo() {};
};

struct B
{
    B() {}

    void setA(A* a) { mA = a; }
    foo()           { mA->foo(); }

    A *mA;
};

内にA関連付けられた (単なるアドレス) がありますB。であっB::mAてはなりませんnull。私は通常忘れてsetAおり、バグが導入されています。それを避けるための良い習慣は何ですか?またsetA、次のようにしたらどうでしょうか。

void B::setA(A& a) { mA = &a; }
4

4 に答える 4

6

最善の方法は、そもそもポインタを避けることです。std::unique_ptrポインターを使用する必要がある場合は、やなどのスマート ポインターの使用を検討してstd::shared_ptrください。そして常に、ポインターを null (スマートポインターを使用しない限り) または割り当てたものに初期化します。そして、それらを使用する前に常に 常にnull をチェックしてください。

于 2013-09-21T12:16:39.517 に答える
1

「たいてい setA を忘れると、バグが発生します。」

したがって、コンストラクターで設定するように強制します。

struct B
{
    public:
      B(A *a) : ma(a) {}

    private:    
      A *mA;
};

そしてそれをfooチェックしましょう:

foo()
{
  if (mA)
    mA->foo();
  else
    // handle it, throw exception, ignore, ...!
}
于 2013-09-21T12:21:38.417 に答える
1

オブジェクトが常にオブジェクトの前に初期化される場合は、最初の選択肢として参照を使用しBます。

struct B
{
    B(A& a) : mA(a) {}    
    foo() { mA.foo(); }    
    A& mA;
};

A a;
B b(a);   
于 2013-09-21T12:22:42.507 に答える