954,500 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Instantiation of class objects

This refers to instantiation and "uninstantiation".

I need to solve an ode system many times with a varying paramter p in an iterative loop.

It seems that I cannot use "out" and "ode" repetitively in the code below.
The code works when N=1.

Is there a way of "uninstantiating" and then "reinstantiating" "out" and "ode" so that the program works for N>1?

I have searched the web and C++ books without success.

I'd appreciate some advice.

Best wishes

Alan

Doub x1, x2, h, p;
    Int N;
   
    x1=0.0, x2=1.0;
    N=5;
    for (Int i=0;i<N;i++)
    
    {
    p=0.1*i;
    Output out(1000);
    rhs_van d(p);
    Odeint<StepperDopr5<rhs_van> > ode(ystart,x1,x2,atol,rtol,h1,hmin,out,d);
    ode.integrate();
   
   }
AlanZinober
Newbie Poster
3 posts since Aug 2008
Reputation Points: 10
Solved Threads: 0
 

Its hard to say why that code isn't working, since we have no idea what Output and Ode are -- resumeably c++ classes. That would normally not be a problem.

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

I have simplified the problem. If in main I have

Output out(1000);
Output out1(1000);

it works.

If in main I have

Output out(1000);
Output out(1000);

it does not work. "Redeclaration of Output out".

The struct Output code is now below.

Alan

struct Output {
	Int kmax;
	Int nvar;
	Int nsave;
	bool dense;
	Int count;
	Doub x1,x2,xout,dxout;
	VecDoub xsave;
	MatDoub ysave;
	Output() : kmax(-1),dense(false),count(0) {}
	Output(const Int nsavee) : kmax(500),nsave(nsavee),count(0),xsave(kmax) {
		dense = nsave > 0 ? true : false;
	}
	void init(const Int neqn, const Doub xlo, const Doub xhi) {
		nvar=neqn;
		if (kmax == -1) return;
		ysave.resize(nvar,kmax);
		if (dense) {
			x1=xlo;
			x2=xhi;
			xout=x1;
			dxout=(x2-x1)/nsave;
		}
	}
	void resize() {
		Int kold=kmax;
		kmax *= 2;
		VecDoub tempvec(xsave);
		xsave.resize(kmax);
		for (Int k=0; k<kold; k++)
			xsave[k]=tempvec[k];
		MatDoub tempmat(ysave);
		ysave.resize(nvar,kmax);
		for (Int i=0; i<nvar; i++)
			for (Int k=0; k<kold; k++)
				ysave[i][k]=tempmat[i][k];
	}
	template <class Stepper>
	void save_dense(Stepper &s, const Doub xout, const Doub h) {
		if (count == kmax) resize();
		for (Int i=0;i<nvar;i++)
			ysave[i][count]=s.dense_out(i,xout,h);
		xsave[count++]=xout;
	}
	void save(const Doub x, VecDoub_I &y) {
		if (kmax <= 0) return;
		if (count == kmax) resize();
		for (Int i=0;i<nvar;i++)
			ysave[i][count]=y[i];
		xsave[count++]=x;
	}
	template <class Stepper>
	void out(const Int nstp,const Doub x,VecDoub_I &y,Stepper &s,const Doub h) {
		if (!dense)
			throw("dense output not set in Output!");
		if (nstp == -1) {
			save(x,y);
			xout += dxout;
		} else {
			while ((x-xout)*(x2-x1) > 0.0) {
				save_dense(s,xout,h);
				xout += dxout;
			}
		}
	}
};
AlanZinober
Newbie Poster
3 posts since Aug 2008
Reputation Points: 10
Solved Threads: 0
 

If course you can't declare the same object more than once. In your initial post, when you said it doesn't work, what exactly do you mean by that? What makes you believe it doesn't work?

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 
If course you can't declare the same object more than once. In your initial post, when you said it doesn't work, what exactly do you mean by that? What makes you believe it doesn't work?

For the new simplified version below, the compiler reported the error
"redeclaration of Output out".

In the original looping program the compilation worked, but the program stopped executing (I believe) when it reached the second "Output output".

My question is "How do I avoid this problem?" I need to "destroy" the instantiation somehow.

Alan

Output out(1000);
Output out1(1000);
AlanZinober
Newbie Poster
3 posts since Aug 2008
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You