Re: TClonesArray typecasting

From: Christian Holm Christensen <>
Date: Wed, 15 Nov 2006 10:50:15 +0800

Hi All,

On Tue, 2006-11-14 at 19:48 +0100, Rene Brun wrote:
> Replace

> (TH1F *) bigArr[chan]->Fill(j, value);
> by
> (TH1F *) bigArr[chan])->Fill(j, value);

This is old-style C-like casts, that is generally frowned upon in C++. Instead, you should use one of the 4 cast operators in C++:

        Returns 0 if o is of a class that doesn't doesn't inherit from
        T.  Is expensive. T must be a reference or pointer type. 
        Casts o to an object of type T.  T must be a reference or
        pointer type. 
        Adds or removes const and/or volatile qualification of object o
        of unqualified type T. 
        Cast to anything.  This is what is closest to the C-style cast.
        This cast should never really be used if at all avoidable. 

In your case, it's probably best to do


since you _know_ that the objects stored in bigArr are of class TH1 or derived classes.

When reading from a file, it's best to use dynamic_cast, as you may not know the type of the object returned. Suppose there's an object in the file named `o' and it's of class TH1F. If you do

        TH2* h = dynamic_cast<TH2*>(file->Get("o"))

You will get a null pointer back, since `o' is not of type TH2 or any of it's decedents. However, if you do one of

        TH2* h = static_cast<TH2*>(file->Get("o"))
        TH2* h = (TH2*)(file->Get("o"))

you will get a pointer back, but it will not be valid - i.e., the program will fail at runtime.

The basic type system of C++ is pretty rich, but by using C-style casts you are completely circumventing that.


 ___  |  Christian Holm Christensen 
  |_| |  -------------------------------------------------------------
    | |  Address: Sankt Hansgade 23, 1. th.  Phone:  (+45) 35 35 96 91
     _|           DK-2200 Copenhagen N       Cell:   (+45) 24 61 85 91
    _|            Denmark                    Office: (+45) 353  25 404
 ____|   Email:               Web:
 | |
Received on Wed Nov 15 2006 - 03:50:26 MET

This archive was generated by hypermail 2.2.0 : Mon Jan 01 2007 - 16:32:02 MET