Re: [ROOT] Classes within Classes?

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Oct 08 2003 - 21:49:13 MEST


Hi Mark,

the member SinnerClass junk is private. You cannot write a C++ statement 
like test2->junk.Print().

You should provide a member function returning a reference to the member 
junk, or declare your members public.

Rene Brun

On Wed, 8 Oct 2003, Mark Wallace 
wrote:

> Hello,
>     I'm new to ROOT and  I'm having problems in reading the tree I 
> created and it looks like I am having problems with seeing a class that 
> is inside another class.  Here is an example program I was playing with 
> to test this.
> 
> File SClass.h
> --------------------------------------------------------------------------------------------
> #include <iostream>
> #include "TObject.h"
> using namespace std;
> 
> class SInnerClass : public TObject {
>  private:
>   Float_t fXX;
>   Float_t fYY;
>  public:
>   SInnerClass() {fXX = fYY = -2;}
>   void Print() const;
>   ClassDef (SInnerClass,1)
> };
> class SClass : public TObject {
>  private:
>   Float_t fX;         
>   Float_t fY;         
>   SInnerClass junk;
>  public:
>   SClass() {fX = fY = -1;}
>   void Print() const;
>   ClassDef (SClass,1)
> };
> -------------------------------------------------------------------------------------------------
> File SClass.cpp
> -------------------------------------------------------------------------------------------------
> #include "SClass.h"
> ClassImp (SClass);
> ClassImp (SInnerClass);
> 
> void SClass::Print() const {
>   cout << "fX = " << fX << ", fY = " << fY << endl;
> };
> void SInnerClass::Print() const {
>   cout << "fXX = " << fXX << ", fYY = " << fYY << endl;
> };
> ------------------------------------------------------------------------------------------------
> File LinkDef.h
> ------------------------------------------------------------------------------------------------
> #ifdef __CINT__
> #pragma link off all globals;
> #pragma link off all classes;
> #pragma link off all functions;
> #pragma link C++ class SInnerClass+;
> #pragma link C++ class SClass+;
> ------------------------------------------------------------------------------------------------
> I compile this to give me a shared library and run this in root using
> this makefile
> -------------------------------------------------------------------------------------------------
> ARCH          = linuxdeb
> CXX           =
> ObjSuf        = o
> SrcSuf        = cxx
> ExeSuf        =
> DllSuf        = so
> OutPutOpt     = -o
> ROOTCFLAGS   := $(shell root-config --cflags)
> ROOTLIBS     := $(shell root-config --libs)
> ROOTGLIBS    := $(shell root-config --glibs)
> CXX           = g++
> CXXFLAGS      = -O -Wall -fPIC
> LD            = g++
> LDFLAGS       = -O
> SOFLAGS       = -shared
> CXXFLAGS     += $(ROOTCFLAGS)
> LIBS          = $(ROOTLIBS) $(SYSLIBS)
> GLIBS         = $(ROOTGLIBS) $(SYSLIBS)
> 
> SCLASSO       = SClass.$(ObjSuf) SClassDict.$(ObjSuf)
> SCLASSS       = SClass.$(SrcSuf) SClassDict.$(SrcSuf)
> SCLASSSO      = libSClass.$(DllSuf)
> SCLASS        = SClass$(ExeSuf)
> SCLASSLIB     = $(SCLASSSO)
> OBJS          = $(SCLASSO)
> PROGRAMS      = $(SCLASS)
> 
> .SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(DllSuf)
> $(SCLASSSO):    $(SCLASSO)
>         $(LD) $(SOFLAGS) $(LDFLAGS) $^ $(OutPutOpt) $@
>         @echo "$@ done"
> 
> SClassDict.$(SrcSuf): SClass.h LinkDef.h
>     @echo "Generation dictonary $@..."
>     @rootcint -f $@ -c $^
> .$(SrcSuf).$(ObjSuf):
>     $(CXX) $(CXXFLAGS) -c $<
> ---------------------------------------------------------------------------------------------
> In root I type this
> 
> root [0] .L libSClass.so
> root [1] SClass *test2 = new SClass;
> root [2] test2->Print();
> fX = -1, fY = -1
> root [3] test2->junk.Print();
> Error: Symbol test2 is not defined in current scope  FILE:(tmpfile) LINE:1
> Error: Failed to evaluate test2->junkError: Failed to evaluate 
> test2->junk.Print()Possible candidates are...
> filename       line:size busy function type and name
> *** Interpreter error recovered ***
> 
> How do you define a class inside a class so you can use it in root?
> 
> I'm using Root Version 3.05/04 running on debian linux
> 
> Thanks
> 
> Mark
> 
> 



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET