静态成员函数和派生类的问题
Issue with static member function and derived class
我有一个带有静态成员函数的类(这是必需的)。以便能够使用类的非静态成员。我定义了一个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函数时,基类的解向量突然被破坏了。
听起来问题源自派生类,而使用这种设计,问题可能出现在任何地方。你似乎没有使用任何语言结构来达到预期的目的,你打破了所有的规则,而且不清楚为什么。
当我在上面的例子中调用Add_Term函数时,基类的解向量突然损坏了。就像它被取消分配了。
忽略代码,当您增加std::vector
的大小时,它可能会重新分配(即deallocate并移动)所包含的对象到更大的内存块。因此,不能对增大的std::vector
使用指针或迭代器。
如果程序的某些部分在调用Add_Term
时跟踪ij_Indexes
内部的事情,它必须
- 使用整数偏移量(
std::size_t
是最好的类型)和下标操作符(语法类似ij_Indexes[offset]
)或 -
ij_Indexes
的类型应该更改为容器std::deque
,它不会重新分配,但不是平面数组,并且与基于c的数学库不兼容,例如您似乎正在使用。
您的static_这个成员不是静态的。即使是这样,静态字段(数据成员)也只有一个实例,但是一个类可以有多个实例。您的Static_This成员将指向哪个实例?
不管怎样,这看起来是一个奇怪的设计。如果你发布你的真实代码(或至少描述它),我相信有人会建议你一个更好的设计。
相关文章:
- 从基指针到派生的强制转换问题
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- SIGSEGV 因为基/派生类的继承问题
- C 两个派生的类中有彼此的对象(包括问题)
- 使用 boost::序列化将派生类指针序列化为向量时出现问题
- 类型特征检查 CRTP 派生,在基类中,问题是未定义的类型
- 有关通过派生类在命名空间内继承的问题
- 如果私有虚拟函数被覆盖为派生类中的公共函数,那么问题是什么
- 分配派生类的对象时出现问题,其中基类具有抽象虚函数
- 覆盖派生类的函数时遇到问题
- 派生类中的模板存在问题
- 使用基对象修改/访问派生类的信息的有问题的设计
- 设计问题迫使我将基类向下转换为派生类型
- 从嵌套在模板中的类派生时编译问题
- 从派生类调用基类函数时出现问题
- 派生类问题中的C++继承默认构造函数
- 如何解决具有多个派生类的抽象基类的继承问题
- 使用Boost:serialize反序列化指向派生类的指针时出现问题
- c++派生类构造函数问题
- 继承的问题:派生类不继承基类