我有一个带静态成员函数的类(这是必要的)。能够使用该类的非静态成员。我定义了一个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"));
}
我从派生类虚函数调用基类的函数。我唯一的问题是,一旦我从派生类调用基类的成员函数,那么数据(此处为Solution)就会被破坏。即当我在上面的例子中调用Add_Term函数时,基类的解决方案向量突然被破坏。这就像它被取消分配一样。
答案 0 :(得分:1)
听起来问题源于派生类,并且通过这种设计,它可以在任何地方。您似乎没有使用任何语言结构用于预期目的......您违反了所有规则,并且不清楚原因。
当我在上面的示例中调用Add_Term函数时,基类的解决方案向量突然被破坏。这就像它被取消分配一样。
忽略代码,当您增加std::vector
的大小时,它可能会将包含的对象重新分配(即 deallocate 并移动)到更大的内存块。因此,您不能将指针或迭代器用于大小增加的std::vector
。
如果程序的某些部分在ij_Indexes
的调用中跟踪Add_Term
内的内容,则必须
std::size_t
是最佳类型)和下标运算符(语法如ij_Indexes[offset]
)或ij_Indexes
的类型应更改为容器std::deque
,该容器不会重新分配但不是平面数组,并且与基于C的数学库不兼容,例如您出现使用。答案 1 :(得分:0)
您的Static_This成员不是静态的。即使它是,只有一个静态字段(数据成员)的实例,但可以有一个类的多个实例。您的Static_This成员指向哪个实例?
无论如何,这似乎是一个奇怪的设计。如果您发布真实代码(或至少描述它),我相信有人会建议您更好的设计。