Hi Philippe, Sven, et al,
On Mon, 30 Oct 2000 15:11:35 -0600
Philippe Canal <pcanal@popgtw.fnal.gov> wrote
concerning ": RE: [ROOT] linking and calling comlied code at runtime":
> A more flexible way is to introduce a new top class, for example AllTasks :
Good, idea. One can also have
// Start of main file
#include <TROOT.h>
#include "MyClass.h"
TROOT myRoot("myRoot","My ROOT");
int main(int argc, char** argv) {
gROOT->Macro("MySetup.C"); // which makes a MyClass instance
MyClass* myObject = MyClass::Instance();
myObject->DoIt();
}
// EOF
with
// -*- mode: c++ -*- For Emacs :-)
// Start of file MyClass.h
#ifndef FOO_MyClass
#define FOO_MyClass
#ifndef ROOT_TObject
#include <TObject.h>
#endif
class MyClass : public TObject {
private:
static MyClass* fgInstance; // Pointer to instance
Int_t fMyData; // Data
public:
MyClass();
MyClass(int myArg) : fMyData(myArg) { fgInstance = this; }
virtual ~MyData() {}
static MyClass* Instance()
virtual void DoIt();
virtual Int_t GetMyData() const { return fMyData; }
ClassDef(MyClass,0) // My singleton class
};
#endif
// EOF
And,
// Start of file MyClass.cxx
#include "MyClass.h"
#include <iostream.h> // Micros**t VC++ doesn't get <iostream>
ClassImp(MyClass); // You can have `;' after this, so Emacs is happy
MyClass* MyClass::fgInstance = 0;
MyClass* MyClass::Instance() {
if (!fgInstance) fgInstance = new MyClass;
return fgInstance;
}
void MyClass::DoIt() {
cout << "MyObject has the data: " << fMyData << endl;
}
// EOF
Then you can derive any class from MyClass, say MyMain, kept in shared
library "libMyMain.so", and "MySetup.C", could look like
// Start of file
{
gSystem->Load("libMyMain.so");
MyMain* myObject = new MyMain("fubar");
myObject->SetHuttelihut(foo, bar, baz, gnus, gnat);
}
You see the point. Setup of your class is done in a (uncompiled)
script, while everything else is in compiled code.
Maybe it's also possible to do
// Start of main file
#include <TROOT.h>
#include "MyClass.h"
void Config(); // Forward declaration of function
TROOT myRoot("myRoot","My ROOT");
int main(int argc, char** argv) {
gROOT->Load("MySetup.C"); // which makes a MyClass instance
Config(); // Using function defined in script
MyClass* myObject = MyClass::Instance();
myObject->DoIt();
}
// EOF
and
// Start of file
void Config()
{
gSystem->Load("libMyMain.so");
MyMain* myObject = new MyMain("fubar");
myObject->SetHuttelihut(foo, bar, baz, gnus, gnat);
}
but I haven't tried it.
Yours,
Christian -----------------------------------------------------------
Holm Christensen Phone: (+45) 35 35 96 91
Sankt Hansgade 23, 1. th. Office: (+45) 353 25 305
DK-2200 Copenhagen N Web: www.nbi.dk/~cholm
Denmark Email: cholm@nbi.dk
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:36 MET