Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should a C++ constructor that interfaces with hardware do real work? [duplicate]

Possible Duplicate:
How much work should be done in a constructor?

I'm strugging with some advice I have in the back of my mind but for which I can't remember the reasoning.

I seem to remember at some point reading some advice (can't remember the source) that C++ constructors should not do real work. Rather, they should initialize variables only. The advice went on to explain that real work should be done in some sort of init() method, to be called separately after the instance was created.

The situation is I have a class that represents a hardware device. It makes logical sense to me for the constructor to call the routines that query the device in order to build up the instance variables that describe the device. In other words, once new instantiates the object, the developer receives an object which is ready to be used, no separate call to object->init() required.

Is there a good reason why constructors shouldn't do real work? Obviously it could slow allocation time, but that wouldn't be any different if calling a separate method immediately after allocation.

Just trying to figure out what gotchas I not currently considering that might have lead to such advice.

like image 698
wadesworld Avatar asked Mar 08 '10 06:03

wadesworld


People also ask

What should a constructor do?

The purpose of constructor is to initialize the object of a class while the purpose of a method is to perform a task by executing java code. Constructors cannot be abstract, final, static and synchronised while methods can be. Constructors do not have return types while methods do.

Can a constructor be called twice?

A constructor is called only once per object instance. Although, you may choose to call the constructor within the same class. You will have to call it with new key word. This will essentially create a new object instance and the constructor would be invoked by new instance.

What is something that can be done in a class constructor?

Description. A constructor enables you to provide any custom initialization that must be done before any other methods can be called on an instantiated object.

Can we fetch the memory address of a constructor?

You cannot take the address of a constructor (C++98 Standard 12.1/12 Constructors - "12.1-12 Constructors - "The address of a constructor shall not be taken.") Show activity on this post. I encountered this same problem. My solution was a template function which called the constructor.


1 Answers

I remember that Scott Meyers in More Effective C++ recommends against having a superfluous default constructor. In that article, he also touched on using methods liked Init() to 'create' the objects. Basically, you have introduced an extra step which places the responsibility on the client of the class. Also, if you want to create an array of said objects, each of them would have to manually call Init(). You can have an Init function which the constructor can call inside for keeping the code tidy, or for the object to call if you implement a Reset(), but from experiences it is better to delete an object and recreate it rather than try to reset its values to default, unless the objects is created and destroyed many times real-time (say, particle effects).

Also, note that constructors can perform initialization lists which normal functions could not.

One reasons why one may caution against using constructors to do heavy allocation of resources is because it can be hard to catch exceptions in constructors. However, there are ways around it. Otherwise, I think constructors are meant to do what they are supposed to do - prepare an object for its initial state of execution (important for object creation is resource allocation).

like image 156
Extrakun Avatar answered Oct 22 '22 16:10

Extrakun