C++ 템플릿

18860 단어 codenewbiecppbeginners
이전 article에서는 함수 템플릿에 대해 썼습니다. 이제 C++의 클래스 템플릿에 대해 작성하겠습니다.

클래스 템플릿이란 무엇입니까?



클래스 템플릿은 일반 생성자, 메서드, 소멸자 등을 사용하여 일종의 특수 클래스를 만들 수 있는 청사진이라고 할 수 있습니다. Student 클래스가 있습니다.

class Student{
private:
    std::string temp;
    int data;
public:
    Student(std::string t, int d){
        temp = t;
        data = d;
    }
    int getdata(){
        return data;
   }
   std::string getstring(){
        return temp;
  }
};


그리고 우리는 이것과 비슷하지만 데이터 멤버로서 stringdouble을 가진 다른 클래스를 모델링하고 싶습니다. 일반적으로 우리는 같은 내용이지만 다른 이름을 가진 다른 클래스를 작성하고 intdouble으로 변경할 수 있습니다. 특히 콘텐츠가 많은 클래스일 때 지루하고 시간이 오래 걸리고 코드가 매력적이지 않게 보일 수 있지만 클래스 템플릿은 유사한 클래스가 필요한 경우 템플릿 역할을 할 클래스를 하나만 작성할 수 있기 때문에 작업을 훨씬 쉽게 만들 수 있습니다. Student 클래스로 그렇게하십시오.

#include <iostream>

template<typename S>
class Student{
    template<typename T> //this is for the overloading of the << operator
    friend std::ostream &operator<<(std::ostream &os, const Student<T> &rhs);
private:
    std::string temp;
    S data;
public:
    Student(std::string t, S d){
        temp = t;
        data = d;
    }
    S getdata() const{
        return data;
   }
   std::string getstring() consr{
        return temp;
  }
};
template<typename S> //another template is needed since the ones above can't be reused
std::ostream &operator<<(std::ostream &os, const Student<S> &rhs){
       os << "Name: " << rhs.getstring() << " Data: " << rhs.getdata();
       return os;
}


I overloaded the stream insertion << operator so i can output Student objects easier

I suggest you read the former article on function templates before this one



클래스의 template<typename S> 속성을 모든 데이터 유형을 모델링하는 데 사용할 템플릿 매개변수 data을 생성합니다. 따라서 int을 템플릿 매개변수 S으로 대체했습니다. Studentstring , double , 다른 데이터 유형을 가질 수 있는 기능, 이제 다음과 같은 float 객체를 생성합니다.

int main(){
    Student<double> padawan{"Padawan", 3.6};
    std::cout << padawan.getdata() << std::endl; //3.6
    Student<std::string> erik{"erik", "human"};
    std::cout << erik.getdata() << std::endl; //human
    Student<Student<int>> casey{"casey", {"glory", 16}};
    std::cout << casey.getstring() << std::endl; // casey
    std::cout << casey.getdata() << std::endl; // Name: glory Data: 16
    //or
    std::cout << casey.getdata().getstring() << std::endl; // glory
    std::cout << casey.getdata().getdata() << std::endl; // 16
    return 0;
}


이제 Student 및 기타 데이터 유형을 모델링할 수 있는 Student 개체를 만드는 것이 얼마나 쉬운지 알 수 있습니다. 두 속성을 템플릿으로 만들 수 있습니다(예: stringX temp). 하지만 템플릿 매개변수에 추가해야 합니다. S data이므로 컴파일러는 template<typename X, typename S>이 무엇인지 알 수 있습니다. X 및 다른 string 개체가 포함된 Student 개체를 모델링했습니다. 이 템플릿을 적절하게 활용하면 불필요한 코드를 많이 작성하지 않아도 됩니다. 또한 이러한 Student 개체를 만드는 데 사용한 구문은 친숙해 보일 수 있습니다. Student 과 같은 vector 객체를 생성할 때 벡터도 무대 뒤에서 템플릿 클래스이기 때문에 데크, 맵, 링크 등과 같은 다른 C++ containers도 마찬가지입니다. 그게 다야, 이것은 클래스 템플릿에 대한 기본적인 보기일 뿐이며 상속, 다형성 등을 혼합할 때 매우 복잡해질 수 있습니다. 다음은 IDE에 복사하려는 경우에 대비하여 지금까지 보여드린 소스 코드입니다.

#include <iostream>

template<typename S>
class Student{
template<typename T>
    friend std::ostream &operator<<(std::ostream &os, const Student<T> &rhs);
private:
    std::string temp;
    S data;
public:
    Student(std::string t, S d) :temp{t}, data{d}{
    }
    S getdata() const{
        return data;
   }
   std::string getstring() const{
        return temp;
  }
};
template<typename S>
std::ostream &operator<<(std::ostream &os, const Student<S> &rhs){
       os << "Name: " << rhs.getstring() << " Data: " << rhs.getdata();
       return os;
}
int main(){
    Student<double> padawan{"Padawan", 3.6};
    std::cout << padawan.getdata() << std::endl; //3.6
    Student<std::string> erik{"erik", "human"};
    std::cout << erik.getdata() << std::endl; //human
    Student<Student<int>> casey{"casey", {"glory", 16}};
    std::cout << casey.getstring() << std::endl; // casey
    std::cout << casey.getdata() << std::endl; // Name: glory Data: 16
    //or
    std::cout << casey.getdata().getstring() << std::endl; // glory
    std::cout << casey.getdata().getdata() << std::endl; // 16
    return 0;
}

좋은 웹페이지 즐겨찾기