2016-04-29 42 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 else條件創造DummyObject,之後析構函數(我爲了調用類,得不到良好的執行的析構函數創建dummyobject但它的工作原理,是不是真正的話題;))

有點更多見解:在我的信息模型中有

  1. a DataType-Object,和
  2. 實例 - 該類型的對象。

在析構函數中,我想刪除該類型的所有實例(它們在列表中被標記)。儘管如此,這一切都發生在特定的datatype.cpp文件中。所述DummyObject只爲了調用析構函數創建(刪除實例)

是有C++中的可能性具有一些特殊產生該2行與ObjID的信息的片段?

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

// ... 

dummyTypeInstance->~AutomationDomainTypeBase(); 

我不想使用腳本來生成代碼(它會太長)。

+2

爲什麼你必須顯式調用析構函數?特別是如果oyu刪除下一行中的實例... – anderas

+2

好消息。你不必自己調用'析構函數'。當你調用'delete dummyTypeInstance;'時,框架會自動調用它(你的變量具有的類型的析構函數)。如果你的變量有一些常見的'base type',你必須在派生類型中創建'virtual distructor'(只需在每個析構函數中添加'virtual' keywod) –

+1

如果我猜對了,你使用UaModeler來生成C++代碼。我建議聯繫統一自動化支持以獲取生成代碼的詳細信息。他們的公共論壇可以在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的信息中提取選擇,哪個BaseType要創建,它是一個int,但是被定義爲String-Macros。 – Pepelee

+1

我想我現在明白了。我想現在有辦法做到這一點。由於預處理在編譯之前將其內容替換爲其內容。 如果你想做關聯,你必須在任何地方聲明它。 – Tezirg