Issue with static member function and derived class
我有一个带有静态成员函数的类(这是必需的)。能够使用类的非静态成员。我定义了一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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; }; |
我在类的构造函数中设置了
1 2 3 4 5 6 7 | template<> Energy_Minimizer<double>::Energy_Minimizer(MPI_Comm Communicator_) { Communicator = Communicator_; Static_This = this; ... } |
可访问非静态虚拟功能:
1 2 3 4 5 6 7 8 9 10 11 | 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():
1 2 3 4 5 6 7 | 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函数时,基类的解向量会突然损坏。就好像它被取消了分配。
这听起来像是源于派生类的问题,通过这种设计,它可以出现在任何地方。你似乎没有使用任何语言结构来达到预期的目的……你违反了所有的规则,这不清楚为什么。
When I call Add_Term function in above example the Solution vector of the base class suddenly gets corrupted. It is like it gets de-allocated.
忽略代码,当增加
如果程序的某些部分在调用
- 使用整数偏移量(
std::size_t 是最好的类型)和下标运算符(语法如ij_Indexes[offset] 或 - 应将
ij_Indexes 的类型更改为容器std::deque ,该容器不会重新分配,但不是平面数组,并且与基于C的数学库(如您似乎正在使用的库)不兼容。
你的静态成员不是静态的。即使是这样,静态字段(数据成员)也只有一个实例,但一个类可以有多个实例。您的静态成员将指向哪个实例?
不管怎么说,这似乎是个奇怪的设计。如果你发布你真正的代码(或者至少描述它),我相信会有人建议你一个更好的设计。