RE: Multiple inheritance and I/O

From: Philippe Canal <pcanal_at_fnal.gov>
Date: Fri, 25 Jan 2008 10:57:10 -0600


Hi Clark,

To disable the warning, you need to explictly set the Class version to 0 and to generate the regular dictionary. So you need to use:

   #pragma link C++ class NoIOClass;

(note that there is no trailing character between the class name and the semicolon) and use either

class NoIOClass {
public:
  // Don't ever save.
  ClassDef(NoIOClass,0)
};

Or

class NoIOClass {
public:
  // Don't ever save.
};

#ifndef __CINT__

// This should be in the source file
RootClassVersion(NoIOClass,0);
#endif
 

Cheers,
Philippe.

-----Original Message-----
From: Clark McGrew [mailto:clark.mcgrew_at_sunysb.edu] Sent: Thursday, January 24, 2008 5:56 PM To: Philippe Canal
Cc: RootTalk mailing list
Subject: RE: [ROOT] Multiple inheritance and I/O

Hi Philippe,

Thanks for the quick reply.

I'd already arrived at the solution you suggest, and it works great (but, it generates warnings about missing ShowMembers methods for the mix-ins).

My two specific questions are:

Will this functionality continue to be supported (i.e. excluding the non-TObject mix-ins from I/O while allowing I/O for the mix-in+TObject derived class)? Since it generates a warning, I'm worried that it might be considered an abuse of the I/O system.

Is there any way to disable the "Cannot find any ShowMembers..." in TClass::BuildRealData(void*)? That means adding a new way tell the I/O system that ShowMembers is intentionally missing (I assume that you want to leave the warning).

Thanks,
Clark

BTW: Here's a (very) simplified example of what I'm doing. The MyClass objects will be saved, but the NoIOClass portions should not be written.

class NoIOClass {
  // Don't ever save.
}

class MyClass : public TObject, public NoIOClass {

   ...
   ClassDef(MyClass, 3); // My class needs IO }

with linkdef's

#pragma link C++ class MyClass+;
#pragma link C++ class NoIOClass-;

On Thu, 2008-01-24 at 16:16 -0600, Philippe Canal wrote:

> Hi Clark,
> 
> You still need to generate the dictionary via rootcint.
> However to disable the I/O, just set the class version to 0:
> 
> 	ClassDef(MyClass,0);
> 
> (ClassDef is required for classes inheriting from TObject).
> 
> For classes not inheriting from TObject, you can also use 
> the syntax:
> 	#pragma link C++ class NonTObject-;
> (note the trailing minus sign). 
> 
> Cheers,
> Philippe.
> 
> -----Original Message-----
> From: owner-roottalk_at_root.cern.ch [mailto:owner-roottalk_at_root.cern.ch] On
> Behalf Of Clark McGrew
> Sent: Thursday, January 24, 2008 12:19 PM
> To: RootTalk mailing list
> Subject: [ROOT] Multiple inheritance and I/O
> 
> Hello All,
> 
> I'm working with some classes that inherit from TObject, and inherit
> from several "mix-in" base classes.  What is the proper way tell ROOT to
> ignore a base class (so it doesn't take part in I/O)?  In fact, I've
> found that I get the right behavior by creating CINT definitions for the
> mix-in classes to exclude I/O.   Looking at the ROOT source code, and
> verifying the output files shows that ROOT is correctly reading and
> writing the classes, but  I get a warning from TClass::BuildRealData
> about the missing ShowMembers method (it is after all missing).  Can the
> warning be disabled?
> 
> Thanks,
> Clark
-- 
Clark McGrew, Assoc. Prof.
Dept. of Physics and Astronomy
State University of New York at Stony Brook
<clark.mcgrew_at_stonybrook.edu>
631-632-8299
Received on Fri Jan 25 2008 - 17:57:17 CET

This archive was generated by hypermail 2.2.0 : Mon Jan 28 2008 - 11:50:01 CET