C++ 템플릿 샘플...

namacin의 이미지

C++을 공부중입니다. 간단한 템플릿 예제를 만들어 봤는데
컴파일과 동작은 이상이 없습니다만..
제대로 이해를 하고 만든건지 조언을 듣고 싶어서요

고수님들이 보고 어떠한 문제 점이 있는지 지적을 해주시면 고맙겠습니다. 꾸벅~

#include <iostream>

using std::cout;
using std::endl;

//----------------------------------------------------------------
template <typename C>
class classData
{
public:
	virtual void func( void ) = 0;
};

//----------------------------------------------------------------
template <typename C>
class classA : public classData<C>
{
private:
	int a;
public:
	classA( int z ){ a = z; };
//	void func( void ) { a++; cout << a << endl; };
	void func( void );
};

//----------------------------------------------------------------
template <typename C>
void classA<C>::func( void )
{
	a++;
	cout << a << endl;
}

//----------------------------------------------------------------
template <typename C>
class classB : public classData<C>
{
private:
	C b;
public:
	classB( C z ){ b = z; };
	void func( void ) { };
};

//----------------------------------------------------------------
template <typename C>
class classC : public classData<C>
{
private:
	C c;
public:
	classC( C z ){ c = z; };
	void func( void ) { c += 10; cout << c << endl; };
};

//----------------------------------------------------------------
template <typename C>
class Test
{
public:
	void func( C *t )
	{
		t->func( );
	};
};

//----------------------------------------------------------------
int main( void )
{
	classA<int> a(10);
	classB<int> c(20);
	classC<int> b(40);		// func()을 사용하지 않더라도 based 클래스에 virtual로 
							// 선언되어 있으므로 dummy 펑션으로 func()을 만들어 
							// 주어야 한다.
//	int d = 100;					
	Test< classData<int> > t;	// Test 클래스에서 사용하는 자료형이
								// classData<> 형 템플릿이다.

	t.func( &a );
	t.func( &b );
	t.func( &c );
//	t.func( &d );			// t의 자료형과 매칭시킬수 없어서 컴파일 에러

	return 0;
}

girneter의 이미지

namacin wrote:

//----------------------------------------------------------------
template <typename C>
class classData
{
public:
	virtual void func( void ) = 0;
};

//----------------------------------------------------------------
template <typename C>
class Test
{
public:
	void func( C *t )
	{
		t->func( );
	};
};

제가 남 code 를 봐줄 주제는 못됩니다만,
Test::func() 함수의 매개변수는
classData 형이 와야만 하니까
아래처럼 바꾸시는게 더 맞지 않을까 싶네요.

//----------------------------------------------------------------
template <typename C>
class classData
{
public:
	virtual void func( void ) = 0;
};

//----------------------------------------------------------------
template <typename C>
class Test
{
public:
	void func( classData<C> *t )
	{
		t->func( );
	};
};

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

namacin의 이미지

답변 감사합니다.
지금 막 보고 수정해 돌려 봤는데 컴파일에서 에러가 나네요

g++     TemplateSample.cpp   -o TemplateSample
TemplateSample.cpp: In function `int main()':
TemplateSample.cpp:79: error: no matching function for call to `
   Test<classData<int> >::func(classA<int>*)'
TemplateSample.cpp:62: error: candidates are: void Test<C>::func(classData<C>*) 
   [with C = classData<int>]
TemplateSample.cpp:80: error: no matching function for call to `
   Test<classData<int> >::func(classC<int>*)'
TemplateSample.cpp:62: error: candidates are: void Test<C>::func(classData<C>*) 
   [with C = classData<int>]
TemplateSample.cpp:81: error: no matching function for call to `
   Test<classData<int> >::func(classB<int>*)'
TemplateSample.cpp:62: error: candidates are: void Test<C>::func(classData<C>*) 
   [with C = classData<int>]
make: *** [TemplateSample] Error 1

생각해보니까 main()에서

Test< classData<int> > t;

와 같이 선언을 했으니까 Test class의 C 자체가 classData<C> 가 되는것이 아닌가 싶습니다.
어찌됐건 답변 감사합니다. 꾸벅~

템플릿이란 놈.. 개념상으로는 별거 아닌거 같았는데
막상 써먹어 보려니까 이것저것 생각해야할게 많네요..
C++ 너무 어렵습니다.. ㅠ.ㅠ

doldori의 이미지

namacin wrote:
생각해보니까 main()에서

Test< classData<int> > t;

와 같이 선언을 했으니까 Test class의 C 자체가 classData<C> 가 되는것이 아닌가 싶습니다.


그렇습니다. 따라서 수정한 코드에서는 Test<int> t 로 써야지요.
좀 더 유연하게 만들기 위해 template template parameter와
template member function을 쓰는 방법도 있습니다.
template <template <typename> class C> 
class Test 
{ 
public: 
    template<typename T>
    void func( C<T> *t ) 
    { 
        t->func( ); 
    }; 
}; 

//---------------------------------------------------------------- 
int main( void ) 
{ 
    classA<char> a(10); 
    classB<int> c(20); 
    classC<long> b(40);

    Test< classData > t;
    t.func( &a ); 
    t.func( &b ); 
    t.func( &c ); 

    return 0; 
} 
namacin의 이미지

좋은 답변들 감사드립니다.

제가 가지고 있는 책에는 이런 내용들이 없었는데..
난이도를 조금 높여서 다른 책을 사서 봐야겠네요

괜찮은 책 좀 추천해주시겠습니까?
너무 이론적인 책은 cpu 사양이 떨어지는 탓인지 잘 이해가 안되더라구요.
손으로 이해할 수 있는 책이면 좋을것 같습니다.
꾸벅~

doldori의 이미지

  • Bjarne Stroustrup, The C++ Programming Language 본문과 부록의 템플릿 부분만 이해하면 실무에서 부족함을 느낄 일은 별로 없습니다.
    게다가 C++의 바이블로 통하는 책이니 사두면 손해볼 일은 없을 겁니다.

  • D. Vandevoorde & N. Josuttis, C++ Templates: The Complete Guide 제목 그대로 템플릿에 대해서만 다룹니다. 상당히 깊은 부분까지 다루고 있기에
    내용은 어려운 편입니다. 저도 지금 이 책을 보고 있는데 진도가 무척 느립니다. --;
[/]

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.