Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- c++ basic practice
- virtual function table
- operator overloading
- virtual destructor
- constructor
- dynamic_cast
- pointer to member data
- this call
- vector size
- 더 지니어스 양면포커
- placement new
- virtual inheritance
- diamond inheritance
- vector capacity
- member function pointer
- std::endl
- return by reference
- virtual function
- C++
- base from member
- c++ multi chatting room
- std::cout
- suffix return type
- std::vector
- new&delete
- delete function
- increment operator
- std::ostream
- conversion constructor
- discord bot
Archives
- Today
- Total
I'm FanJae.
[C++ 기본 연습 문제] Chapter 13. 템플릿(Template) 1 본문
1. Chapter 13 템플릿(Template) 1
1-1. 함수 템플릿의 정의
① 인자로 전달되는 두 변수에 저장된 값을 서로 교환하는 SwapData라는 이름의 함수를 템플릿으로 정의해보자.
- 그리고 다음 Point 클래스를 대상으로 값의 교환이 이뤄짐을 확인할 수 있도록 main 함수를 구성해보자.
class Point
{
private:
int xpos, ypos;
public:
Point(int x = 0, int y = 0) :xpos(x), ypos(y)
{
}
void ShowPosition() const
{
cout << '[' << xpos << ", " << ypos << ']' << endl;
}
};
#include <iostream>
template <typename T>
void SwapData(T& value, T& value2)
{
T temp = value;
value = value2;
value2 = temp;
}
class Point
{
private:
int xpos, ypos;
public:
Point(int x = 0, int y = 0) :xpos(x), ypos(y)
{
}
void ShowPosition() const
{
std::cout << '[' << xpos << ", " << ypos << ']' << std::endl;
}
};
int main(void)
{
Point pos1(5, 8);
Point pos2(10, 16);
pos1.ShowPosition();
pos2.ShowPosition();
std::cout << "Swap 함수 실행결과" << std::endl;
SwapData(pos1, pos2);
pos1.ShowPosition();
pos2.ShowPosition();
}
② 다음은 int형 배열에 저장된 값을 모두 더해서 그 결과를 반환하는 기능의 함수이다
int SumArray(int arr[], int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
sum += arr[i];
return sum;
}
- 이 함수를 템플릿으로 정의하여, 다양한 자료형의 배열을 대상으로 합을 계산하는 예제를 작성해보자
#include <iostream>
template <typename T>
T SumArray(T arr[], int len)
{
T sum = 0;
for (int i = 0; i < len; i++)
{
sum += arr[i];
}
return sum;
}
int main(void)
{
int arr[5] = { 1,2,3,4,5 };
int sum = 0;
sum = SumArray(arr, 5);
double arr1[5] = { 1.5 ,2.5,3.5,4.5,5.5 };
double sum2 = 0.0;
sum2 = SumArray(arr1, 5);
std::cout << sum << std::endl;
std::cout << sum2 << std::endl;
}
1-2. 클래스 템플릿의 정의
① 만약에 Chapter 11을 공부하면서 스마트 포인터도 공부를 해싸면, 이 문제를 반드시 해결하고 넘어가기 바란다. 자! 그럼 문제를 제시하겠다. 우리는 앞서 Chapter 11에서 다음의 형태로 스마트 포인터를 정의하였다.
class SmartPtr
{
private:
Point *posptr;
public:
SmartPtr(Point *ptr) : posptr(ptr) { }
Point& operator*() const { return *posptr; }
Point* operator->() const { return posptr; }
~SmartPtr() { delete posptr; }
};
- 이 스마트 포인터를 템플릿으로 정의하여, 어떠한 클래스의 객체도 참조할 수 있는 포인터가 되게 하자.그리고는 아래의 Point 클래스와 main 함수를 기반으로 예제를 완성해보자. 참고로 스마트 포인터는 이렇듯 템플릿의 형태로 정의가 된다.
class Point
{
private:
int xpos, ypos;
public:
Point(int x=0, int y=0) : xpos(x), ypos(y) { }
void SetPos(int x, int y)
{
xpos = x;
ypos = y;
}
void ShowPosition() const { std::cout << '[' << xpos << ", " << ypos << ']' << std::endl;
};
int main(void)
{
SmartPtr<Point> sptr1(new Point(1, 2));
SmartPtr<Point> sptr2(new Point(3, 4));
sptr1->ShowPosition();
sptr2->ShowPosition();
sptr1->SetPos(10, 20);
sptr2->SetPos(30, 40);
sptr1->ShowPosition();
sptr2->ShowPosition();
return 0;
}
#include <iostream>
template <typename T>
class SmartPtr
{
private:
T* posptr;
public:
SmartPtr(T* ptr) : posptr(ptr) { }
T& operator*() const { return *posptr; }
T* operator->() const { return posptr; }
~SmartPtr() { delete posptr; }
};
class Point
{
private:
int xpos, ypos;
public:
Point(int x = 0, int y = 0) : xpos(x), ypos(y) { }
void SetPos(int x, int y)
{
xpos = x;
ypos = y;
}
void ShowPosition() const {
std::cout << '[' << xpos << ", " << ypos << ']' << std::endl;
};
};
int main(void)
{
SmartPtr<Point> sptr1(new Point(1, 2));
SmartPtr<Point> sptr2(new Point(3, 4));
sptr1->ShowPosition();
sptr2->ShowPosition();
sptr1->SetPos(10, 20);
sptr2->SetPos(30, 40);
sptr1->ShowPosition();
sptr2->ShowPosition();
return 0;
}
'C++ > Basic Practice' 카테고리의 다른 글
[C++ 기본 연습 문제] Chapter 11. 연산자 오버로딩 II (1) | 2024.09.12 |
---|---|
[C++ 기본 연습 문제] Chapter 10. 연산자 오버로딩 I (0) | 2024.09.08 |
[C++ 기본 연습 문제] Chapter 08. 상속과 다형성 (0) | 2024.09.07 |
[C++ 기본 연습 문제] Chapter 07. 상속(Inheritance)의 이해 (1) | 2024.09.06 |
[C++ 기본 연습 문제] Chapter 05. 복사 생성자(Copy Constructor) (0) | 2024.09.05 |
Comments