2009-12-12 5 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

아니요, 열거 형 선언을 전달할 수 없기 때문에 불가능합니다. 또한, 관련이 없지만, 그 contructor try 블록은 나쁜 생각입니다.

또한 허브 셔터의 기사 (http://www.ddj.com/cpp/184401297)를 참조하십시오. 그는 나보다 약간 덜 비난합니다. 어쨌든, 내가 말했듯이, try 블록은 당신의 질문과는 아무 상관이 없습니다.

+0

감사합니다. 도움 주셔서 감사합니다. 나는 ctor에서 try catch 블록에 대해 읽었고, 두 권의 책과 한 개의 기사 (어느 것이지만 Scott Meyers가 쓴 기사인지는 기억하지 못한다.), Bjarne의 Meyers가 쓴 두 번째 책. 이것이 좋은 생각이라고 단호하게 주장하는 이유는 무엇입니까? –

+0

글쎄, 나는 모든 마이어스 북 카를 읽었고 마지막 한 권을 제외하고는 모든 스트로스트 럽트를 읽었습니다. 생성자 catch 블록의 문제점은 아무 것도 유용하지 않다는 것입니다. C++에서는 어쨌든 try & catvch mutch를 사용하지 말아야합니다. 대신 RAII를 사용해야합니다. RAII는 Meyers & BS가 자신의 모든 책에서 광범위하게 토론하는 방식입니다. –

+0

당신이 말한 것을 내가 맡을 것입니다. 이 책을 통해 페이지를 보내고 그들이 그 건설을 설명 할 시간이 없다. –

0

오류를 수정하면 해결할 수 있습니다.

편집 :열거 형을 클래스 안에 넣고 싶다고 말하면서 주석을 놓치 셨습니다. 그렇게 할 수는 없습니다.

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

2) 당신은 생성자 수준의 try 블록에서 반환 할 수 없습니다 :

1) 당신이 그를 기본 클래스의 생성자를 호출 할 경우 템플릿입니다. 당신은 (다시) 던져서 만 나갈 수 있습니다 - 나는 다시 던지기에 아무 것도하지 않는 것으로 가정합니다.

어쨌든 이러한 간단한 유형에서 어떤 종류의 예외가 예상됩니까?

3) 한 곳에서 my_data_ 대신 my_data을 언급하고 있습니다. 그런데 복사 생성자와 대입 연산자가 기본 동작을 갖는다면 왜 복사 생성자와 구현 연산자를 구현합니까? (후자는 *this을 반환해야합니다.)

+0

Neil에 대한 이전 코멘트에서 말했듯이이 건축물에 대해 읽었으며 초보자로서이 건물을 암기하고 익숙하게 만드는 데 노력하고 있습니다.(물론이 간단한 예제에서 던지는 예외는 없다고 생각합니다.) –

+0

어쨌든 모든 도움을 주셔서 감사합니다 –

0

클래스에 열거 형을 넣을 수있는 방법이 있습니다! ... kind of

나는 이것을하기를 원했고, 해결책은 열거 형이 항상 기본 유형 (기본적으로 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; 
    } 

}; 

위의 코드 토큰 클래스없이 컴파일하면 내가 확인할 수없는,하지만 난이 기술을 사용하는 코드를 컴파일.

환호