2016-04-29 19 views
0

私の情報モデルには、400以上のデータ型があります。これは、AutomationDomainTypeという名前です。型(コンストラクタとメンバ)はモデラーから生成されますが、残念ながらデストラクタは生成されません。だから私は彼らのデストラクタを実装し、私のメイン機能でそれらを呼び出す必要があります:文字列からクラスコンストラクタを動的に生成する

void deleteObjectTypeUA(OpcUa_UInt16 ObjID, OpcUa_UInt16 NsIdx) 
{ 

if (ObjID == PrefixId_AutomationDomainType) 
    { 
     NodeManagerRoot* pNodeManagerRoot = NodeManagerRoot::CreateRootNodeManager(); 
     auto dummyTypeInstance = new NamespacePrefix::AutomationDomainTypeBase(UaNodeId(PrefixId_AutomationDomainType, 2), 
      UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot); 
     dummyTypeInstance->~AutomationDomainTypeBase(); 
     delete dummyTypeInstance; 
    } 

私は手動でデータ型.cpp s内のデストラクタを実装する必要がありますが、私のdeleteType機能で、私は400を作るためにしたくありませんif elseDummyObjectを作成するための条件、およびそれ以降のデストラクタ(私はクラスのデストラクタではなく、良い実装を呼び出すためにdummyobjectを作成するが、それは動作し、本当に話題ではありません;))

ビットより多くの洞察力:私の情報モデルには、

  1. データ型オブジェクト
  2. インスタンス - そのタイプのオブジェクト。

デストラクタでは、そのタイプのインスタンスをすべて削除したい(リストにタグが付けられています)。このすべては特定のdatatype.cppファイルで起こります。 DummyObjectは、インスタンスを削除するためにデストラクタを呼び出すために作成されただけです

ObjIDの情報を使ってスニペットにこの2行を生成する魔法がありますか?

auto dummyTypeInstance = new NamespacePrefix::AutomationDomainTypeBase(UaNodeId(NamespacePrefixId_AutomationDomainType, 2), 
      UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot); 

// ... 

dummyTypeInstance->~AutomationDomainTypeBase(); 

コードを生成するためにスクリプトを使用したくない(時間がかかりすぎる)。

+2

を持っているすべての組み合わせでテンプレート関数を使用していますか?特にoyuが次の行のインスタンスを削除する場合は... – anderas

+2

良いニュース。自分で 'destructor'を呼び出す必要はありません。 'delete dummyTypeInstance;'を呼び出すと、フレームワークはそれをautomaticaly(あなたの変数が持つ型のデストラクタ)と呼ぶでしょう。変数にいくつかの共通の '基本型'がある場合、派生型で 'virtual distructor'を作成する必要があります(ちょうどすべてのデストラクタに' virtual' keywodを追加してください)。 –

+1

私は正しいと思えば、UaModelerを使ってC++コードを生成しています。生成されたコードの詳細については、Unified Automationサポートにお問い合わせください。彼らの公開フォーラムは既にhttp://forum.unified-automation.com –

答えて

1

私はあなたが探しているものはテンプレートであると思います。

はのはのは、使用するために、いくつかのダミーのタイプを定義してみましょう任意の種類

template <typename BaseDomainType_T, unsigned int PrefixID> 
void deleteObject(unsigned int ObjID) { 
    if (ObjID == PrefixID) 
    { 
     NodeManagerRoot* pNodeManagerRoot = NodeManagerRoot::CreateRootNodeManager(); 
     auto dummyTypeInstance = new BaseDomainType_T(UaNodeId(PrefixID, 2), 
     UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot); 
     delete dummyTypeInstance; 
    } 
} 

のために働くの汎用テンプレート関数を定義してみましょう。これらのあなたの生成された型は

typedef int BaseTypeOne; 
typedef unsigned int BaseTypeTwo; 

は、なぜあなたは明示的にデストラクタを呼び出す必要があります我々は

void deleteObjectTypeUA(unsigned int ObjID, unsigned int NsIdx) { 
    //For base type 1 
    deleteObject<BaseTypeOne, 0>(ObjID); 
    deleteObject<BaseTypeOne, 1>(ObjID); 
    deleteObject<BaseTypeOne, 2>(ObjID); 
    deleteObject<BaseTypeOne, 3>(ObjID); 
    //For base type 2 
    deleteObject<BaseTypeTwo, 0>(ObjID); 
    deleteObject<BaseTypeTwo, 1>(ObjID); 
} 
+0

正しく理解すれば、テンプレート関数をさまざまなBaseTypes deleteObjectTypeUAにあります。しかし、私はdeleteObjectTypeUAの400 BaseTypeのすべての可能性をタイプしたいとは思っていません。 ObjIDの情報(intであるがString-Macrosとして定義されている)からのみ、BaseTypeを作成する選択肢を抽出したい。 – Pepelee

+1

私は今理解していると思います。今私はそれをする方法があります。前処理は、コンパイルする前にその内容でマクロを置き換えます。 アソシエーションを行う場合は、とにかくそれをどこかで宣言する必要があります。 – Tezirg

関連する問題