[완료] c++ 템플릿 관련 질문

bakyeono의 이미지


자료구조 공부하면서 컨테이너 템플릿을 하나 만들었어요.
여기에 다른 객체는 적용이 잘 되는데, 한가지 문제가 있네요.
다른 클래스를 상속한 클래스를 제대로 담을 수가 없네요.

예를들어,
Parent 클래스 타입의 객체를 담는 컨테이너 인스턴스를 만들었을 때
Parent 클래스를 상속한 Child 클래스 타입의 객체는 이 컨테이너에 제대로 적용이 안되요.

컨테이너에 들어가긴 하지만 Child 클래스로 적용되는게 아니라 Parent 클래스로 적용이 되네요.
그래서 Parent 클래스의 특성만 갖고, virtual 함수도 전부 Parent 함수로 실행되고요.

코드를 써본다면 이런 식이겠군요...

[geshifilter-code]template <typename T> class List { private: T data; public: void Input(const T& object) {data= object;} }; class Parent { }; class Child : Parent { }; int main(void) { List<Parent> list; Child chlid; list.Input(chlid); } [/geshifilter-code]
이렇게 썼을 경우 list 인스턴스에는 Child 타입의 객체가 아닌 Parent 타입의 객체가 담겨요. ㅜ.ㅜ
템플릿에 자료 저장하는 멤버를 T가 아닌 T*로 잡아 봐도, 포인터로만 쓰면 괜찮지만, 컨테이너 내에서 (new T 방식으로) 동적 할당할 경우에는 T 타입 객체를 만드는 셈이라서 똑같은 문제가 생기네요.
이거 Parent, Child 모두 담을 수 있게 하려면 어떻게 해야 되나요?

klara의 이미지

복사되고 있으므로 당연합니다.
포인터로 쓰면 됩니다만, "컨테이너 내에서 (new T 방식으로) 동적 할당할 경우에는 T 타입 객체를 만드는 셈이라서 똑같은 문제가 생기네요." 라는 부분은 뭐가 문제가 되는건지 모르겠네요.

bakyeono의 이미지

List <Parent*> list;
이렇게 포인터형으로 인스턴스를 만들고 컨테이너 외부에서 동적할당해서 포인터만 넘기고 저장하면 되더군요.
다만 컨테이너 내부에서 동적할당을 처리하면 마찬가지로 T타입 객체를 생성하는거라 마찬가지더군요

컨테이너 내부에서 메모리 관리를 하도록 만들고 싶었는데,
그냥 외부에서 처리해야겠네요. ^^

klara의 이미지

포인터를 쓰면서 메모리관리가 자동으로 되기를 원한다면 boost::shared_ptr을 이용하는 것도 고려해볼만 합니다.
아니면 뭐 포인터 전용으로 컨테이너를 만들수도 있겠습니다만, 이경우는 객체복사에 대해 좀 신경써야겠지요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.