Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are some of the disadvantages of using a reference instead of a pointer?

Given a class "A" exists and is correct. What would be some of the negative results of using a reference to "A" instead of a pointer in a class "B". That is:

// In Declaration File
class A;

class B
{
public:
   B();
   ~B();
private:
    A& a;
};

// In Definition File
B::B(): a(* new A())
{}

B::~B()
{
    delete &a;
}

Omitted extra code for further correctness of "B", such as the copy constructor and assignment operator, just wanted to demonstrate the concept of the question.

like image 974
JadziaMD Avatar asked Nov 09 '11 20:11

JadziaMD


2 Answers

The immediate limitations are that:

  • You cannot alter a reference's value. You can alter the A it refers to, but you cannot reallocate or reassign a during B's lifetime.
  • a must never be 0.

Thus:

  • The object is not assignable.
  • B should not be copy constructible, unless you teach A and its subtypes to clone properly.
  • B will not be a good candidate as an element of collections types if stored as value. A vector of Bs would likely be implemented most easily as std::vector<B*>, which may introduce further complications (or simplifications, depending on your design).

These may be good things, depending on your needs.

Caveats:

  • slicing is another problem to be aware of if a is assignable and assignment is reachable within B.
like image 90
justin Avatar answered Sep 30 '22 19:09

justin


You can't change the object referred to by a after the fact, e.g. on assignment. Also, it makes your type non-POD (the type given would be non-POD anyway due to the private data member anyway, but in some cases it might matter).

But the main disadvantage is probably it might confuse readers of your code.

like image 38
celtschk Avatar answered Sep 30 '22 20:09

celtschk