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