2009-12-12 90 views
1

編譯一次

#include "stdafx.h" 
#include "Token.h" 

//I would like this enum to be inside class Number 
enum Number_enm {ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE}; 

class Number : public Token<Number_enm>//and this template parameter to be Number::Number_enm 
{ 
private: 

public: 
    Number(const Number_enm& num) 
    try: 
    Token(num) 
    { } 
    catch(...) 
    { 
     cerr << "Error in Number::Number(const Number_enm&)."; 
     return; 
    } 

    Number(const char num) 
    try: 
    Token(static_cast<Number_enm>(num & 0xf)) //get number value from char 
    { 
#ifdef DEBUG_ 
    cout << "Converting ctor, from char to Token.\n"; 
#endif 
    } 
    catch(...) 
    { 
     cerr << "Error in Number::Number(const char num)."; 
     return; 
    } 

}; 

#pragma once 

/*Abstract class*/ 
template<class T> 
class Token 
{ 
    typedef T value_type; 
private: 
    value_type my_data_; 
protected: 
    /*Token() 
    try: my_data_() 
    { } 
    catch(...) 
    { 
     cerr << "Error in Token<T>::Token()."; 
     return; 
    }*/ 
    Token(const value_type value) 
     try: 
    my_data_(value) 
    { } 
    catch(...) 
    { 
     cerr << "Error in Token<T>::Token(const value_type&)."; 
     return; 
    } 
    /*Token(const Token& value): my_data(value) 
    { }*/ 
    Token& operator=(const Token& right) 
    { 
#ifdef DEBUG_ 
     cout << "Token& operator=(const Token& right).\n"; 
#endif 
     my_data = right; 
     return my_data; 
    } 
public: 
    T get() const 
    { 
     return my_data_; 
    } 
    T set(const T& new_value) 
    { 
     T old = my_data_; 
     my_data_ = new_value; 
     return old; 
    } 
}; 

我不知道是否有可能做這樣的建築呢?內部枚舉作爲基類模板參數

回答

1

不,你不能轉發聲明一個枚舉。此外,但不相關,那些構造塊嘗試塊是一個壞主意。

查看赫布薩特的文章http://www.ddj.com/cpp/184401297 - 他比我少一點譴責。無論如何,正如我所說的,try塊與你的問題無關。

+0

好的,謝謝你的幫助。我讀過關於ctor中的try catch塊,有兩本書和一篇文章(不記得哪一篇是Scott Meyers撰寫的文章),還有Meyer寫的Bjarne第二本書。堅持認爲這是一個好主意,爲什麼你說這是個壞主意? – 2009-12-12 16:32:12

+0

嗯,我讀過除了最後一張之外的所有邁耶斯書和所有Stroustrups,我從來沒有讀過任何一個這樣的事。構造器catch塊的問題是它沒有做任何有用的事情。在C++中,你不應該使用try&catvch mutch - 相反,你應該使用RAII,Meyers&BS在他們所有的書中都會廣泛討論。 – 2009-12-12 16:36:39

+0

我會採取你說的話。真的沒有時間,通過這本書來發送你的頁面沒有在他們解釋說,建設。 – 2009-12-12 16:44:33

0

在我看來,你可以,如果你修復錯誤。

編輯:錯過了評論,說你想要enum在課堂內:你不能這樣做。

1)如果你想調用基類的構造函數,然後是一個模板:

Number(const Number_enm& num) 
    try: 
    Token<Number_enm>(num) 

2)您不能從構造層次try塊返回。您只能通過(重新)投擲退出 - 我認爲沒有做任何默認重新投擲。

無論如何,你會從這些簡單的類型中期待什麼樣的例外?

3)在一個地方,你指的是my_data而不是my_data_。但是,那麼,爲什麼如果它們具有默認行爲,則實現了複製構造函數和賦值運算符? (後者應該返回*this。)

+0

就像我在我之前對Neil發表的評論中所說的,我已經閱讀過關於這個構造的內容,因爲我是初學者,所以我試圖用這種構造來記住它並讓自己熟悉它。(當然,在這個簡單的例子中,我不希望拋出任何異常) – 2009-12-12 16:45:24

+0

無論如何,感謝您的幫助 – 2009-12-12 16:46:27

0

有一種方法可以將您的枚舉放入您的類中! ...

我也想這樣做,我想出的解決方案依賴於枚舉總是有一個基礎類型(我熟悉的所有編譯器默認爲int)的事實。你必須在基類所期望的所有地方指定'int'而不是你的枚舉,但是你可以將你的枚舉傳遞給這些函數!所以你的情況,你可以這樣做:

#pragma once 
#include "stdafx.h" 
#include "Token.h" 

class Number : public Token<int> // 'int' instead of 'Number_enm' 
{ 
private: 

public: 
    enum Number_enm {ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE}; 

    Number(const Number_enm& num) 
    try: 
    Token(num) // Passed in a Number_enm! 
    { } 
    catch(...) 
    { 
     cerr << "Error in Number::Number(const Number_enm&)."; 
     return; 
    } 

    // I don't know what your Token class does, but I'm guessing that you 
    // need to static_cast to int instead of Number_enm 
    Number(const char num) 
    try: 
    Token(static_cast<Number_enm>(num & 0xf)) //get number value from char 
    { 
#ifdef DEBUG_ 
    cout << "Converting ctor, from char to Token.\n"; 
#endif 
    } 
    catch(...) 
    { 
     cerr << "Error in Number::Number(const char num)."; 
     return; 
    } 

}; 

我無法驗證,如果上面的代碼編譯沒有令牌類,但我已編制採用此方法的代碼。

乾杯