2015-10-16 9 views
1

正如您可能已經從標題中注意到的那樣,我具有不同的類,特別是3,並且每個類都響應不同的樹實現。對於包含在主C++中的不同類的相同功能

在Tree1.h

class Tree1 { 
public: 

    struct node{ 
     char label; 
     node* nHMI_ptr; 
     node* nHD_ptr; 
    }; 

    node* root; 

    Tree1(); 

    ~Tree1();  

    bool Empty(); 

    Tree1::node& Root(); 

    void AddSon(int i, node &n, char l); 
    /* 
    * 
    * (other functions) 
    */ 
} 

在Tree2.h

class Tree2 { 
public: 

    struct node{ 
     char label; 
     node* nHMI_ptr; 
     node* nHD_ptr; 
     node* nFather_ptr; 
     node* nHI_ptr; 
    }; 

    node* root; 

    Tree2(); 

    ~Tree2(); 

    bool Empty(); 

    Tree2::node& Root(); 

    void AddSon(int i, node &n, char l); 
    /* 
    * 
    * (other functions) 
    */ 
} 

在Tree3.h

class Tree3{ 
public: 
    Tree3(); 

    ~Tree3(); 

    struct node; 

    struct nodeSon{ 
     struct node* node_ptr; 
     nodeSon* nextNodeSon_ptr; 
    }; 

    struct node{ 
     char label; 
     node* nextNode_ptr; 
     struct nodeSon* nSon; 
    }; 

    node* root; 

    bool Empty(); 

    Tree3::node& Root(); 

    void AddSon(int i, node &n, char l); 
    /* 
    * 
    * (other functions) 
    */ 
} 

正如你可以看到他們具有相同的名稱下的功能和成員或標識符。這是因爲我想使用這個函數來製作各種更復雜的算法,但棘手的部分是我想使這個algortihms獨立於所使用的類。我想到的第一件事是在我的main.cpp上創建這個算法。

在main.cpp中

#include <cstdlib> 
#include <iostream> 
#include "Tree1.h" 
//#include "Tree2.h" 
//#include "Tree3.h" 

void someFunc(node n) { 
    //do something by calling Tree functions 
    //E.g. call Empty(), call AddSon(...) 
} 

int main(int argc, char** argv) { 
    return 0; 
} 

什麼我想才達到的是,someFunc(...)適用於所有的樹木,而無需改變任何基礎代碼和剛剛enabiling的#之一包括和禁用另外兩個。

  • 是否可以做到這一點?
  • 我該如何做到這一點?
+1

DR; TL;使用模板來創建'someFunc'的通用版本。 – 101010

+0

也可以有各種樹類繼承自純虛擬類BaseTree,它定義了所有常見的樹功能,然後調用'void someFunc(BaseTree&tree,node n)' – user4581301

+0

@ user4581301 Nope。 '節點'不能在運行時推導出來,除非它已經在基類中聲明瞭。 –

回答

3
  • 是否有可能做到這一點?

  • 我怎樣才能做到這一點?

您只需提供一個模板函數:

template<class TreeType> 
void someFunc(TreeType& treeContext, typename TreeType::node& n) { 
    //do something by calling Tree functions 
    //E.g. call Empty(), call AddSon(...) 
} 
+0

這是一個很好的方法。謝謝! ;) – RedSkull

相關問題