C++ class template

조회수 1618회
#include <iostream>

using namespace std;

template <typename T>
class Stack {
private:
    T* mData;
    int mMaxSize, mTop;
public :
    Stack();
    Stack(int _size);
    Stack(const Stack& _data);
    ~Stack();

    void push(T _data);
    T pop();
    bool isOperator(char _rhs);
    char* changeToPostfix();
    bool isFull();
    bool isEmpty();
};

int main(){

    cout << "Hello world!" << endl;
    return 0;
}

template <typename T>
Stack<T>::Stack()
    : mData(nullptr)
    , mMaxSize(0)
    , mTop(-1) {}

template <typename T> 
Stack<T>::Stack(int _size) 
    : mMaxSize(_size)
    , mTop(-1) {
    mData = new int[_size];
}

template <typename T>
Stack<T>::Stack(const Stack& _data) {

}

template <typename T>
Stack<T>::~Stack() {
    if (mData != nullptr) delete[] mData;
}

template <typename T>
void Stack<T>::push(T _data) {


}

template <typename T>
bool Stack<T>::isOperator(char _rhs) {
    return (_rhs == '*' || _rhs == '/' ||
            _rhs == '+' || _rhs == '-' ||
            _rhs == '(' || _rhs == ')');
}

template <typename T>
char* Stack<T>::changeToPostfix() {
    char* arithExp, postfixExp;
    cin >> arithExp;
    Stack<char> tempStack(strlen(arithExp));

    for (int i = 0; i < strlen(arithExp); i++) {

    }

    return postfixExp;
}

template <typename T>
bool Stack<T>::isFull() {
    return (mTop == mMaxSize - 1);
}

template <typename T>
bool Stack<T>::isEmpty() {
    return (mTop == -1);
}

클래스 템플릿으로 클래스 Stack을 작성하려고 하는데, Stack 클래스를 정의할 때 template으로 정의하면 위 처럼 모든 멤버 함수 를 정의 할 때 template 를 필수 적으로 써줘야 하나요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 네. 반드시 써줘야 합니다.

    왜냐면 함수를 정의할 때, 'T' 라는 글자가 무엇을 뜻하는 지 알려줘야 하기 때문입니다.

    template <typename T>         // 만약 이렇게 T가 템플릿의 타입이름이다. 라고 알려주지 않으면,
    bool Stack<T>::isEmpty() {    // 여기서 <T>가 무엇을 뜻하는 지 컴파일러가 어떻게 알까요?
        return (mTop == -1);
    }
    

    만약 클래스 템플릿의 멤버함수 정의를 내부에 할 경우에는 굳이 알려주지 않아도 됩니다.

    template <typename T>    // 이 선언은 아래 스코프{} 전체에 적용됩니다.
    class Stack {
    private:
        T* mData;
        int mMaxSize, mTop;
    public :
        bool isEmpty() {     // 여기서는 T가 무엇인지 이미 알고 있기 때문에 괜찮습니다.
            return (mTop == -1);
        }
    };    // 여기까지만 적용됩니다.
    
    // 따라서 외부에 함수 정의를 구현할 때는,
    // 다시 template <typename T>를 써줘야 합니다.
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)