2013-10-29 22 views
9

Làm cách nào để chuyển một lớp mẫu tới hàm tạo của lớp khác? Tôi đang cố gắng để vượt qua một lớp bảng băm templated đến một lớp trình đơn mà sẽ cho phép tôi sau đó cho phép người dùng quyết định loại bảng băm.Chuyển lớp mẫu làm tham số

template <class T> 
class OpenHash 
{ 
private: 
    vector <T> hashTab; 
    vector <int> emptyCheck; 
    int hashF(string); 
    int hashF(int); 
    int hashF(double); 
    int hashF(float); 
    int hashF(char); 

public: 
    OpenHash(int); 
    int getVectorCap(); 
    int addRecord (T); 
    int sizeHash(); 
    int find(T); 
    int printHash(); 
    int deleteEntry(T); 
}; 

template <class T> 
OpenHash<T>::OpenHash(int vecSize) 
{ 
    hashTab.clear(); 
    hashTab.resize(vecSize); 
    emptyCheck.resize(vecSize); 
    for (int i=0; i < emptyCheck.capacity(); i++) 
    { 
     emptyCheck.at(i) = 0; 
    } 
} 

Vì vậy, tôi có lớp học này mở băm đó là templated, bởi vì nó phải cho phép bất kỳ loại được bổ sung, tôi đã làm việc này nếu bắt đầu một đối tượng của nó trong chính mình và thay đổi các loại đầu vào, vv

int main() 
{ 
    cout << "Please input the size of your HashTable" << endl; 
    int vecSize = 0; 
    cin >> vecSize; 
    cout << "Please select the type of you hash table integer, string, float, " 
      "double or char." << endl; 
    bool typeChosen = false; 
    string typeChoice; 
    cin >> typeChoice; 
while (typeChosen == false) 
{ 
    if (typeChoice == "int" || "integer" || "i") 
    { 
     OpenHash<int> newTable(vecSize); 
     typeChosen = true; 
    } 
    else if (typeChoice == "string" || "s") 
    { 
     OpenHash<string> newTable(vecSize); 
     hashMenu<OpenHash> menu(newTable); 
     typeChosen = true; 

    } 
    else if (typeChoice == "float" || "f") 
    { 
     OpenHash<float> newTable(vecSize); 
     typeChosen = true; 
    } 
    else if (typeChoice == "double" || "d") 
    { 
     OpenHash<double> newTable(vecSize); 
     typeChosen = true; 
    } 
    else if (typeChoice == "char" || "c" || "character") 
    { 
     OpenHash<char> newTable(vecSize); 
     typeChosen = true; 
    } 
    else 
    { 
     cout << "Incorrect type"; 
    } 
} 
return 0; 
} 

Trong chính tôi, tôi muốn hỏi người dùng loại họ tạo bảng băm. tùy thuộc vào những gì họ nhập vào nó sẽ tạo ra một thể hiện của lớp này với kiểu họ muốn và sau đó chuyển nó đến một lớp khác được gọi là menu, cho phép họ gọi các hàm từ lớp băm.

+0

Bạn có muốn vượt qua một lớp mẫu hay một lớp mẫu chuyên môn? Ví dụ. 'std :: less' hoặc' std :: ít hơn '? – dyp

+0

hashF là hàm băm của tôi. và tôi muốn vượt qua một lớp học được tô điểm. – Shaun1810

Trả lời

13

Bạn có thể sử dụng:

class Ctor { 
public: 
    Ctor(const Other<int>&); // if you know the specific type 
}; 

hay:

class Ctor { 
public: 
    template<class T> 
    Ctor(const Other<T>&);  // if you don't know the specific type 
}; 

Live demo

Các vấn đề liên quan