-1

静的メンバー関数を持つクラスがあります (これは必要です)。クラスの非静的メンバーを使用できるようにするため。Static_Thisクラスへのポインタであるa を定義しました。

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 関数を呼び出すと、基本クラスのソリューション ベクトルが突然破損します。割り当てが解除されるようなものです。

4

2 に答える 2

1

問題は派生クラスで発生しているように聞こえますが、この種の設計ではどこにでもある可能性があります。意図した目的のために言語構造を使用していないようです...すべてのルールを破っていますが、その理由は明らかではありません。

上記の例で Add_Term 関数を呼び出すと、基本クラスのソリューション ベクトルが突然破損します。割り当てが解除されるようなものです。

コードを無視すると、 のサイズを大きくすると、含まれているオブジェクトがより大きなメモリ ブロックにstd::vector再割り当てされる (つまり、割り当てが解除されて移動される) 場合があります。std::vectorしたがって、サイズが大きくなるへのポインターまたはイテレーターを使用することはできません。

ij_Indexesプログラムの一部がへの呼び出し全体で内部のものを追跡する場合Add_Term、それは

  • 整数オフ​​セット (std::size_tが最適なタイプ) と添字演算子 ( のような構文ij_Indexes[offset]) を使用するか、
  • の型はij_Indexescontainer に変更する必要がありますstd::deque。これは再割り当てはしませんが、フラットな配列ではなく、使用しているように見える C ベースの数学ライブラリとは互換性がありません。
于 2013-01-14T08:23:09.663 に答える
0

あなたの Static_This メンバーは静的ではありません。あったとしても、静的フィールド (データ メンバー) のインスタンスは 1 つしかありませんが、クラスのインスタンスは複数存在する可能性があります。Static_This メンバーが指すインスタンスはどれですか?

どう見ても奇抜なデザインです。実際のコードを投稿する (または少なくとも説明する) と、誰かがより良い設計を提案してくれると確信しています。

于 2013-01-14T07:29:55.533 に答える