2013-06-03 2 views
0

3 개의 개인 변수와 2 개의 char 매개 변수 변수가있는 공용 메서드가있는 클래스가 있습니다.C++. 1 매개 변수가 변경되는 클래스

class InitLine 
{ 
private: 
    char *a; 
    char b, c; 

public: 
    InitLine(char *inita, char initc); 
    Init(char *a, char c); 
}; 

지금 메소드의 정의는 간단하다 :

이제
Initline::Init(char *a, char c) 
{ 
    for (b=0; b<c; b++) 
     *(a+c)=0; 
} 

내 질문은 : 나는 다른 parameterTypes와 (* A와 C가, 또는 그 중 하나가되고 함께 같은 동작을 반복하려면 정수 등), 새로운 클래스를 만드는 것이 필요한가, 아니면 기존의 것을 사용해도되고, '타입 캐스팅 (typecasting)'이나 내가 아직 모르는 다른 트릭을 할 수 있을까?

감사와 관련

우베

+0

오버로드 및 템플릿과 같은 다른 매개 변수 냄새가있는 동일한 동작 .. 할 수 있습니다 .. –

+0

대답하기 전에 : 귀하의 명명 규칙은 끔찍합니다. 'a','b'','c' 란 무엇입니까? 그런 다음, 지역 변수 b가 사용 된 장소에 클래스 필드 b를 사용합니다. 이러한 세부 정보로 인해 코드 읽기가 어려워집니다. 좀 더 읽기 쉽도록 코드를 포맷했습니다. – Spook

+0

정확히이 코드가 어떤 일을할지 확실하지 않음 * (a + c) = 0; ...이 코드는 의미가 있거나 무작위 임 – anand

답변

1

를 사용하여 템플릿, 초기화 기능에게 인수 형식의 템플릿을합니다. 예를

0

당신은 단지 다른 유형의 전체 클래스 (뿐만 아니라 초기화), 예를 원한다면에 대한

template <typename T> 
Init(char*a , T c){} 

또한 int * a; int b, c; template classes은 아직 모르는 다른 속임수입니다.

template <typename ANYTYPE> class InitLine 
{ 
private: 
    ANYTYPE *a; 
    ANYTYPE b, c; 

public: 
    void InitLine(ANYTYPE *inita, ANYTYPE initc); 
    void Init(ANYTYPE *a, ANYTYPE c); 
}; 


template <typename ANYTYPE> void Initline<ANYTYPE>::Init(ANYTYPE *a, ANYTYPE c) 
{ 
    for (int b=0; b<c; b++) 
     *(a+c)=0; 
} 


... main() 
{ 
    Initline<int> iline; // initline class based on type int (ANYTYPE -> int) 
    int line[20]; 

    Initline<char> cline; // initline class based on type char (ANYTYPE -> char) 
    char somechars[30]; 

    iline.Init(line, 20); 
    cline.Init(somechars, 30); 
+0

대단히 감사합니다! –

+0

main()에 더 많은 코드를 추가하여 템플릿에 기반하여 char 유형 중 하나와 int 유형 중 하나를 만드는 방법을 보여줍니다. – Nicholaz

+0

아주 좋은 설명. 고맙습니다! –

1

코드에는 여러 작업 공간이 있으므로 추가 작업을 수행하기 전에 수정해야합니다.

  1. 명명 규칙은 끔찍합니다. a, b, c은 무엇인가요?

  2. b을 루프 인덱서로 사용하지만 대신 로컬 변수를 사용해야합니다.

  3. a입니다. 할당 된 위치는 어디입니까? a이 가리키는 메모리의 크기는 얼마입니까?

내가 코드를 같이해야한다고 추측 다음

class InitLine 
{ 
private: 
    char * data; 
    int count; 

public: 
    InitLine(char * newData, int newCount) 
    { 
     // Possible error checking? 
     data = newData; 
     count = newCount; 
    } 

    // No parameters needed here, I guess 
    void Init() 
    { 
     for (int i = 0; i < count; i++) 
      data[i] = 0; 
    } 
}; 

귀하의 질문에 관해서는, 정말 모르겠어요, 당신이 달성하기 위해 노력하고, 당신은 무엇을 하시겠습니까 알고있다. 다음과 같은 방법으로이 클래스를 사용할 필요가

template <typename T> 
class InitLine 
{ 
private: 
    T * data; 
    int count; 

public: 
    InitLine(T * newData, int newCount) 
    { 
     // Possible error checking? 
     data = newData; 
     count = newCount; 
    } 

    // No parameters needed here, I guess 
    void Init() 
    { 
     for (int i = 0; i < count; i++) 
      data[i] = 0; 
    } 
}; 

: 당신이 배열의 모든 유형을 잡고 일반적인 클래스를 작성하려는 경우, 당신은 템플릿을 사용해야 당신이 쓰고 싶은 경우

InitLine<char> line(myData, myDataSize); 
// where myData is a char * and myDataSize is an int 

자신의 매개 변수에 의해 다른 몇 가지 방법은,이 기술은 메소드 오버로딩이라고하며 C++로 사용할 수 있습니다 :

void Init(char * a, int b) { /* sth */ } 
void Init(int * a, int b) { /* sth */ } 

주, 그 컴파일러는 명확하게하는 방법을해야 구별 할 수 있어야합니다 라는. 예 :

void Test(int a) { } 
void Test(char a) { } 

Test(0); // Ambiguity: which method should be called? 

질문을 읽는 동안 이것은 내 마음에 떠오르는 것들입니다. 당신이 요구하는 것이 아닌 경우,보다 구체적으로 질문을 편집하는 것을 고려하십시오.

+0

그래서 전체적인 해독과 방법의 폐기를 반복해야합니까? 다른 사람들이 내가 요구하지 않은 중요하지 않은 세부 사항에 집중하는 대신 그 질문을 이해하려고 노력하십시오. 감사합니다. 그리고 우에베 –

관련 문제