#include "ItemType.h"
#include <iostream>
class FullStack{
public:
FullStack() {
std::cout << "Full Stack! "<< "\n";
}
};
class EmptyStack{
public:
EmptyStack() {
std::cout << "Empty Stack! " << "\n";
}
};
template < class ItemType >
class StackType {
public:
// Constructor
StackType();
// Check whether stack is full!
bool IsFull();
bool IsEmpty();
bool IsLength();
void Push(const ItemType& item);
void Pop();
ItemType Top();
private:
int top; // Stack Pointer. It contains index of top elements.
ItemType items[MAX_ITEMS];
};
template < class ItemType >
StackType<ItemType>::StackType()
{
top = -1;
}
template < class ItemType >
bool StackType<ItemType>::IsFull()
{
return (top == MAX_ITEMS - 1);
}
template < class ItemType >
bool StackType<ItemType>::IsEmpty()
{
return (top == -1);
}
template < class ItemType >
bool StackType<ItemType>::IsLength()
{
return (top + 1);
}
template < class ItemType >
void StackType<ItemType>::Push(const ItemType& item)
{
if (IsFull()) { throw FullStack(); }
top++;
items[top] = item;
}
template < class ItemType >
void StackType<ItemType>::Pop()
{
if (IsEmpty()) {
throw EmptyStack();
}
top--;
}
template < class ItemType >
ItemType StackType<ItemType>::Top()
{
if (IsEmpty()) { throw EmptyStack(); }
return items[top];
}
1) '#'들을 코드에서 제거
2) C++ 컴파일러가 실행
3) ".obj" 파일이 생성 -> Library와의 Link를 통해 ".exe" 파일이 생성된다.
Before) template <class T> class M{T xx;}(class-form); -> compiler가 actual-instance generate! -> After) class M<int>{ int xx;}(actual-instance);
Ex) Myclass.h -> a.cpp(define Myclass), b.cpp(Using Myclass)에서 사용한다 가정
-> template 정의와 operation이 같이 있어야 actaul-instace를 가진 실제 class로 바꾸기 용이하다!
-> a.cpp -> a.obj -> a.exe (main함수 포함 X)
-> b.cpp -> b.obj -> a.exe (main함수 포함 O)
-> 전체에서 같이 실행되는 파일 중에서 main함수는 1개만 있어야 한다!
void f(){
int x; // 함수가 실행 시 memory가 할당된다. 함수 종료시, 자동으로 destroy!
static int y; // 변수y의 주소가 고정된다. 프로그램이 끝나도, 함수가 종료되도 y의 주소는 변하지 않는다!
}
int * p = new int (100); // p는 배열의 첫 원소를 가리킨다. new int(100)의 경우는 이름이 없는 변수이다(anonymous variable)!