template2 질문입니다.
글쓴이: nayana / 작성시간: 수, 2004/05/12 - 1:59오후
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
using std::cerr;
template< typename T > class Stack
{
int m_size;
int m_top;
T *m_data;
public :
explicit Stack( int n = 10 );
~Stack();
void push( const T &item );
const T& pop();
const T& top() const;
bool isEmpty() const
{
return !( m_top >= 0 );
}
bool isFull() const
{
return !( m_top < m_size );
}
};
template< typename T > inline Stack< T >::Stack( int n )
: m_top( -1 ), m_size( n ), m_data( new T[n] )
{
}
template< typename T > inline Stack< T >::~Stack()
{
delete []m_data;
}
template< typename T > void Stack< T >::push( const T& item )
{
if ( !isFull() )
m_data[++m_top] = item;
else
{
cerr << "Stack< T >::push():스택 오버플로우" << endl;
exit( 1 );
}
}
template< typename T > inline const T& Stack< T >::pop()
{
if ( !isEmpty() )
return m_data[m_top--];
else
{
cerr << "Stack< T >::pop(): 스택 언더프로우" << endl;
exit( 1 );
return m_data[m_top];
}
}
template < typename T > inline const T& Stack< T >::top() const
{
return m_data[m_top];
}
int main ( void )
{
const int N = 20;
Stack< char* > book( N );
static char *title[N] =
{
"Standard C++ 정복",
"The C++ Programming Language",
"The Annotated C++ Reference Manual",
"Advanced C++: Programing Styles nad Idioms",
"C++ Programming and Fundamental Concepts",
"C+C++ Programming With Objects in C and C++",
"C++ FAQs",
"C++ for C Programmers",
"C++ Inside & out",
"C++ Tutorial",
""
};
static char *author[N] =
{
"Microsoft",
"Eckel",
"Ira Pohl",
"Marshall P. Cline, Greg A. Lomow",
"Allen I. Holub",
"Arthur R. Anderson, William J.Heinze",
"James 0. Coplien",
"Margaret A. Ellis, Bjarne Stroustrup",
"Bjarne Stroustrup",
"Getfield Ahn",
""
};
int i;
i = 0;
while ( *title[i] )
book.push( title[i++] );
i = 0;
while ( !book.isEmpty() )
cout << i << ' ' << author[i++] << ":\n\t" << book.pop() << endl;
return 0;
}
다음과 같은 warnning 납니다.
tclass1.cpp: In constructor `Stack<T>::Stack(int) [with T = char*]': tclass1.cpp:72: instantiated from here tclass1.cpp:11: warning: member initializers for `int Stack<char*>::m_top' tclass1.cpp:10: warning: and `int Stack<char*>::m_size' tclass1.cpp:32: warning: will be re-ordered to match declaration order
이번에도 원인 모를에러가 문법에 어긋난곳 같은데...다음과 같은 오류가 납니다.
Forums:


[code:1]template< typename T > i
template< typename T > inline Stack< T >::Stack( int n ) : m_top( -1 ), m_size( n ), m_data( new T[n] ) { }이 부분을
template< typename T > inline Stack< T >::Stack( int n ) { m_top= -1, m_size=n, m_data = new T[n]; }이렇게 하니 에러가 안나네요 ^^
걍 코드만보고 이상이 없어 보여서 실행해 봤습니다.
사실 에러가 안나서 어 내 컴파일러가 더 좋은건가? ^^ 무흣.. 하고 생각했는데,
-Wall 옵션을 주니깐 나는군요 ^^
template< typename T > inline Stack< T >::Stack( int n )
: m_top( -1 ), m_size( n ), m_data( new T[n] )
전 위와 같은 선언이 좀 생소하네요. 역시 C++은 배울게 많습니다 ^^
p.s. 코드를 보아하니 숙제같은데.. 멋지네요 ^^
[code:1]template< typename T > i
template< typename T > inline Stack< T >::Stack( int n ) : m_top( -1 ), m_size( n ), m_data( new T[n] ) { }에서
template< typename T > inline Stack< T >::Stack( int n ) : m_top( -1 ), m_size( n ) { m_data = new T[n]; }로 고치면 됩니다.
constructor에 들어가는 초기화 코드 ( ':' 다음에 쓰는 코드) 에는 값만을 초기화 할 수 있습니다. (함수 같은건 못씁니다.)
[/code]
[code:1]template< typename T > inl
template< typename T > inline Stack< T >::Stack( int n ) : m_top( -1 ), m_size( n ) { m_data = new T[n]; }이런식으로 님의 말씀대로 했는데도...똑같은 Warnning 떨어집니다.
그래서 ...윗분 말씀대로
template< typename T > inline Stack< T >::Stack( int n ) { m_top = -1 , m_size = n, m_data = new T[n]; }이런식으로 하니까...Warnning 안떨어집니다.
변수조차도 :변수() 이런식으로 못쓰는건지요...
암튼 답변 감사드립니다.^^
초기화 리스트를 쓸 경우에는 변수 선언 순서와 초기화 순서가 일치해야 합
초기화 리스트를 쓸 경우에는 변수 선언 순서와 초기화 순서가 일치해야 합니다. m_size 가 먼저 선언돼 있으니 m_size 부터 초기화하세요.
[code:1]30 template< typename T >
30 template< typename T > inline Stack< T >::Stack( int n ) 31 : m_size( n ), m_top( -1 ), m_data( new T[n] ) 32 { 33 34 }님의 말씀대로 하였더니...잘됍니다..유용한 정보 감사합니다.
다음부터는 순서에 맞추어서..해야겠습니다.
함수도 초기화리스트에 쓸수있더군요!!!
함수를 초기화 리스트에 써도 문제는 없지만,[code:1]new
함수를 초기화 리스트에 써도 문제는 없지만,
new T[n]와 같은 코드는 문제가 될 소지가 있네요. new가 실패하면 일반적인 방법으로 뒷처리가 불가능하죠.
산넘어 산
댓글 달기