我有一个带有静态成员函数的类(这是必要的)。能够使用类的非静态成员。我定义了Static_This
一个指向类的指针。
template<class T>
class Energy_Minimizer
{
protected:
static Energy_Minimizer* Static_This;
Petsc_Vector<T>* Gradient;
Petsc_Vector<T>* Solution;
static int Form_Function_and_Gradient(Petsc_Vector<T> *Solution_,Petsc_Vector<T> *Gradient_, PetscReal *Function_Value_);
public:
Energy_Minimizer(MPI_Comm Communicator_);
void Add_Term(vector<int>& Indexes, void* Coefs, string Function_Name_);
virtual void Total_Energy()=0;
};
我Static_This
在类的构造函数中设置了。
template<>
Energy_Minimizer<double>::Energy_Minimizer(MPI_Comm Communicator_)
{
Communicator = Communicator_;
Static_This = this;
...
}
并且可以访问非静态虚函数:
int Energy_Minimizer<double>::Form_Function_and_Gradient(Petsc_Vector<double> *Solution_,Petsc_Vector<double> *Gradient_, PetscReal *Function_Value_)
{
Static_This->Solution = Solution_;
Static_This->Gradient = Gradient_;
// Call the user-defined routine to construct the function value, gradient
Static_This->Total_Energy();
return 0;
}
我在派生类中实现了虚函数 Total_Energy():
class Strain_Solver : public Energy_Minimizer<double>;
void Strain_Solver::Total_Energy()
{
****** Here problem occurs ******
this->Add_Term(ij_Indexes, NULL , string("Alpha_Term"));
}
我从派生类的虚函数中调用基类的函数。我唯一的问题是,一旦我从派生类中调用基类的成员函数,数据(此处为解决方案)就会损坏。即当我在上面的示例中调用 Add_Term 函数时,基类的解决方案向量突然被破坏。就像它被取消分配一样。