2013-01-08 211 views
1

的實例,我想實例化一個模板化的抽象類,像下面的一個:創建模板抽象類

template <class T> 
class non_sense { 
public: 
    void virtual nonsesnse_func() = 0; 
}; 

,使這個類的一個整數,比如我試過如下:

void non_sense<int>::nonsesnse_func(){ 
} 

,然後我把我的情況下在主:

non_sense<int> xx; 

所以整個程序如下:

template <class T> 
class non_sense { 
public: 
    void virtual nonsesnse_func() = 0; 
}; 

void non_sense<int>::nonsesnse_func(){ 
} 

void main(){ 
    non_sense<int> xx; 
} 

這對我來說完全有意義,儘管編譯器不接受它,說這個類是抽象的。我不想採用創建一個使用特定模板從這個類繼承的新類的路線,關於我試圖使這將是大量寫作的大型應用程序。有人可以向我解釋爲什麼編譯器拒絕這個,除了爲我想要的特定實例創建一個新類之外,還有什麼辦法可以解決這個問題。

+0

爲什麼你有抽象類的問題?這是一個工具,可以讓所有的「non_sense」類型簽署一個「合約」,表明它們將符合由「non_sense」抽象類型提供的接口。 – tmaric

回答

1

奇怪的是,純虛擬方法可以在C++中有一個實現。這並不改變這個方法純虛擬的事實,並且包含它的類是抽象的。

如果您希望類non_sense是abstact爲各類除了int,你將不得不爲整個類別的專業化,不只是純粹的虛擬成員:

template <class T> 
class non_sense { 
public: 
    virtual void nonsense_func() = 0; 
}; 

template <> 
class non_sense<int> { 
public: 
    virtual void nonsense_func() 
    { 
     std::cout << "no_sense<int>::nonsense_func" << std::endl; 
    } 
}; 

有了較大的類,繼承可能會更容易,因爲那麼派生類可以繼承non_sense中的其他成員,而不必複製整個類(如創建專業化時所需要的那樣)。

3

non_sense是一個抽象類,所以它永遠不會被實例化到一個對象中。然而

這編譯和運行,:

#include <iostream> 

template <class T> 
class non_sense { 
public: 
    virtual void nonsesnse_func(); 
}; 

// Specialize the method 
template<> 
void non_sense<int>::nonsesnse_func(){ 
    std::cout << "no_sense<int>::nonsense_func" << std::endl; 
} 


int main(){ 
    non_sense<int> xx; 

    xx.nonsesnse_func(); 

    return 0; 
} 

而這裏展示如何使一個純粹的抽象類此運行的代碼(我已經改名nosnsnsense廢話,它更容易輸入):

#include <iostream> 

template <class T> 
class non_sense { 
public: 
    virtual void nonsense_func() = 0; 
}; 

template<class T> 
class non_sense_concrete : public non_sense<T> { 

    public: 
     void nonsense_func() { 
      std::cout << "non_sense_concrete<T> generic code" << std::endl; 
     } 

}; 

// Specialize the concrete class 
template<> 
void non_sense_concrete<int>::nonsense_func(){ 
    std::cout << "no_sense<int>::nonsense_func" << std::endl; 
} 


int main(){ 

    non_sense_concrete<double> objectGeneric; 
    objectGeneric.nonsense_func(); 

    non_sense_concrete<int> objectInt; 
    objectInt.nonsense_func(); 


    return 0; 
} 
0

如果你有一個純虛函數的類(例如抽象),你必須創建第二個類來實現這個虛函數。否則,你將永遠無法使用該類。

在你的代碼中,你實現了一個功能正常,但它不是虛擬的,因爲它不在類的內部。它需要被宣佈並被定義爲non_sense的一個子類的一部分才能工作。請記住,只有班級可以有虛擬功能。