2013-04-13 6 views
1

두 개의 정수를 인수로 사용하여 생성자를 만들어야합니다.

거기에서 참조로이 정수를 취하는 메서드를 호출해야합니다. 이 메서드 내에서 정수를 char* (숫자 배열)으로 동적으로 변환해야합니다.

생성자의 끝에는 초기 정수 대신 두 개의 char* 배열이 있어야합니다.템플릿 클래스 - 몇 가지 질문

다른 클래스가 같은 일을하지만 구조체에서하기 때문에 이런 식으로해야합니다. 템플릿 속성에 저장하십시오.


저는 C++ 언어를 처음 사용하지만 템플릿을 사용하는 것이 처음이었습니다. 주제에 대해 조금 연구를하고 효과가 있다는 것을 알았습니다.

모든 것을 직접 컴파일하고 싶지만 내 머리에 C++ 클래스를 구현하는 것이 엉망이되어 컴파일 오류가 꽤 길어집니다.


첫 번째 질문 - 템플릿을 사용하여 수행 할 수 있습니까? 이미 혼자서 뭔가를 작성했기 때문에 두 번째 질문 :

template <class type> class Addition { 
    type num_a; 
    type num_b; 
    void convert(type, type); 
public: 
    Addition(type, type); 
} 

template <class type> Addition::Addition(type a, type b) { 
    convert(&a, &b); 
    num_a = a; 
    num_b = b; 
} 
template <class type> Addition::convert(type *a, type *b) { 
    int temp_a = a, temp_b = b; 
    a = char[256], b = char[256]; 
    // converting 
} 

이 오케이인가, 또는 내가 뭘 잘못 했습니까?
C++로 클래스를 구현하는 방법에 대한 제안 사항이 있습니까?

이유는 같은 값으로 속성을 초기화 할 수 없습니다 :

template <class type> class Addition { 
    type outcome = 0; 
} 

그리고이

template <class type> Addition::Foo(type a, type b) { 
    this->a = a; // a = a; 
    this->b = b; // b = b; 
} 
+0

템플릿이 필요하지 않은 것처럼 보입니다. 먼저 도랑을 풀고 나머지 문제를 해결하십시오. –

답변

2

면책 조항 : 내가하고있는 일에 대해 템플릿이 정말로 필요하다고 판단 할 수는 없습니다. 그것은 당신이 당신의 Adddition 클래스 템플릿을 사용하기를 원하는 타입의 수에 달려있다. int 용으로 만 사용하는 경우 불필요한 복잡성이 발생할 수 있습니다. 나중에 언제든지 리팩토링 할 수 있습니다 (이는 민첩한 접근 방식입니다).

는 템플릿을 사용하려는 경우, 일반적인 규칙은 템플릿 매개 변수에 대한 T를 작성하고, 클래스 템플릿 안에 중첩 된 typedef에 대한 type을 사용하는 것입니다,라고 말했다 가졌어요. typename 또는 class을 사용하는 것은 맛이 있지만, typename은 내장 형식을 인수로 전달할 수도 있다는 사실을 강조합니다. 그러나 참고 만 클래스 템플릿가 인수로 전달 될 수 있다는 사실을 강조

template<template<typename> class U> SomeClass { /* your definition */ }; 
          ^^^^^ // <-- NOT typename here 

를 작성해야템플릿 템플릿 매개 변수.

은 (convert()에 반환 유형을 누락 클래스 정의에 세미콜론 누락) 컴파일에 실패 할 것 중 하나는 코드에 대해 언급 할 수있는 몇 가지 다른 nitpicks있다 : C에서

template <typename T> 
class Addition 
{ 
    static const std::size_t N = 256; // are you sure that 256 is all you'll ever need? 
    T num_a; 
    T num_b; 
    void convert(T const*, T const*); // by T const*, not T* 
public: 
    Addition(T const&, T const&); // by T const&, not T 
}; // <-- make sure to end class definitions with a semi-colon! 

template <typename T> 
Addition::Addition(T const& a, T const& b) 
{ 
    convert(&a, &b); 
    num_a = a; 
    num_b = b; 
} 

template <typename T> 
void Addition::convert(T const* a, T const* b) // <-- use T const* if you don't modify the parameters 
^^^^ // <-- you forgot the return type 
{ 
    int temp_a = a, temp_b = b; 
    a = char[N], b = char[N]; <-- hardcoded 256 is bad practice, better to keep that in 1 place only 
    // converting 
} 

가 + 11 당신도 위임 생성자을 사용할 수 있습니다 (GCC/연타 최신 Visual C에 의해 ++ 물론 지원) 및 템플릿 정의가 헤더에 있어야하기 때문에,

template <typename T> 
Addition::Addition(T const& a, T const& b) 
: 
    Addition(&a, &b) // delegate to the other constructor 
{} 

template <typename T> 
Addition::Addition(T const* a, T const* b) // <-- use T const* if you don't modify the parameters 
{ 
    int temp_a = a, temp_b = b; 
    a = char[N], b = char[N]; <-- hardcoded 256 is bad practice, better to keep that in 1 place only 
    // converting 
} 

마지막으로 쓰기

template <typename T> 
class Addition 
{ 
    static const std::size_t N = 256; // are you sure that 256 is all you'll ever need? 
    T num_a; 
    T num_b; 

    Addition(T const*, T const*) // by T const*, not T* 
    { 
     int temp_a = a, temp_b = b; 
     a = char[N], b = char[N]; 
     // converting 
    } 
public: 
    Addition(T const&, T const&) // by T const&, not T 
    : 
     Addition(&a, &b) // delegate to the other constructor 
    {} 
}; // <-- make sure to end class definitions with a semi-colon! 

이것은 당신이 지루하게 선언과 모든 멤버 함수의 정의를 모두 작성에서 저장 : yway은, 당신도이 같은 클래스 정의 내부 모두를 작성할 수 있습니다. 어쨌든 노력해야하는 짧고 달콤한 클래스의 경우 템플릿을 작성하는 가장 좋은 방법이지만 매우 긴 정의의 경우에는 선언과 정의를 구분할 수 있습니다.

마지막으로 @tacp에서 설명한 것처럼 this->a을 사용하여 클래스 매개 변수 멤버를 함수 매개 변수에서 명확히 구분해야합니다. 이러한 이유로 사람들은 흔히 후행 밑줄 또는 m_ 접두사가있는 데이터 멤버를 작성합니다.

1
을? :처럼 내가 뭔가를 어떻게 C++에서이 키워드를 사용 할 필요가 존재하지 않는 경우 당신의 후자의 질문

:

template <class type> class Addition { 
    //type outcome = 0; 
    //^^^^you have to call default constructor of type 
    type outcome = type(); 
} 

class를 사용하여, 대회 typename을 사용하는 것이 좋습니다도 OK입니다.

template <class type> Addition::Foo(type a, type b) { 
    this->a = a; // a = a; 
    this->b = b; // b = b; 
} 

전달 된 매개 변수와 멤버의 이름이 같은 경우 this을 사용해야합니다. a,b 지역 범위에 있기 때문에 당신은

a =a; 
b =b; 

을 할 수는 없지만, this->a는 클래스 멤버 a을 의미한다.

항상 정수를 char 배열로 변환하고 싶으므로 필자는 템플릿이 필요 없다고 생각합니다. 앞으로 double, float 및 다른 유형을 char*으로 변환하고 싶지 않다면 말입니다. 나는 모든 이슈를 보지 않았으므로 다른 것들이 남아있을 수 있습니다.