0

ElementクラスからMeshクラスのすべてのノードにアクセスできるようにしたいと思います。これを行うために両方のクラスが正しく設定されていると思いますが、Element内のMeshへの静的ポインターを初期化するためのベストプラクティスが明確ではありません。あなたはこれのために通常何をしますか?

ありがとう!

コード(これまでのところ)

//Mesh.h

#pragma once
#ifndef MESH_H
#define MESH_H

#include <vector>
#include <map>
#include "Eigen/Eigen"
#include "Element.h"
#include "Node.h"

class Mesh {
public:
    std::vector< Node* >                m_Nodes;
    std::vector< Element* >             m_Elements;

    Eigen::MatrixXd                     m_K;
    Eigen::VectorXd                     m_F;
    Eigen::VectorXd                     m_u;

    void Mesh::LoadFile(wchar_t* MeshFile);


};

#endif

//Element.h

#pragma once
#ifndef ELEMENT_H
#define ELEMENT_H

#include <vector>

class Mesh;

class Element {
public:
    static Mesh *                       m_Parent;
    static int                          m_ElementCount;
    int                                 m_ElementIndex;
    std::vector< int >                  m_ElementNodes;
};

#endif
4

2 に答える 2

1

あなたの投稿にコメントする評判がないので、ここに投稿する必要があります。

各Elementインスタンスに、その親への独自のポインターを持たせないのはなぜですか?各ポインタは同じメッシュオブジェクトを指すことができます。メモリの節約は本当に重要ですか?

シングルトンメッシュになってしまった場合でも、将来、それぞれが要素のグループを持つ複数のメッシュに拡張したい場合は、変更が簡単になります。

親メッシュへの静的ポインターが必要な場合は、Meshのメソッドで要素の構築をカプセル化し、Meshのコンストラクターでこれに親ポインターを設定できます。

于 2013-03-06T22:38:46.877 に答える
0

静的ポインタを(任意のソースファイルで、ではなく*.h)定義する必要があります。

Mesh* Element::m_Parent; // initialized to NULL by the system

さらに、初期化するには、次の構文を使用します。

Element::m_Parent = whatever;

クラスの設計では何も変更しないようにしましたが、どのメンバー関数とフィールドを使用する必要がstaticあり、どのメンバー関数とフィールドを変更しないかを検討する必要があります。デザインは今は便利に見えません。

于 2013-03-06T22:46:27.310 に答える