[ROOT] Classes within Classes?

From: Mark Wallace (wallace@nscl.msu.edu)
Date: Wed Oct 08 2003 - 21:27:34 MEST


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

-- 
******************************************************
Mark Wallace
Research Assistant
Michigan State University
National Superconducting Cyclotron Laboratory
East Lansing, MI 48824-1321
e-mail  wallace@nscl.msu.edu
******************************************************



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