2013-06-03 3 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 (* а и с, или один из них становятся целое число, например), необходимо ли создать новый класс, или я могу использовать существующий, выполняя некоторую «приведение типов» или какой-либо другой трюк, которого я еще не знаю?

Спасибо и наилучшими пожеланиями

Uwe

+0

такое же действие с различными параметрами пахнет как перегрузки и шаблоны .. вы можете это сделать. –

+0

Перед ответом: ваше соглашение об именах ужасно. Что такое 'a',' b', 'c'? Затем вы используете поле класса b в месте, где должна была использоваться локальная переменная. Эти детали делают чтение вашего кода очень жестким. Я отформатировал ваш код, чтобы быть более читаемым. – Spook

+0

не уверен, что именно будет делать этот код * (a + c) = 0; ... имеет ли этот код какой-то смысл или просто случайно – anand

ответ

1

Используйте шаблоны, сделать функцию Init шаблон вашего типа аргументов.

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

, например

0

Если вы просто хотите, чтобы весь класс с различными типами (не только Init), например, также имеют 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(), чтобы показать, как сделать один из символов типа и одного из типов 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

Итак, я должен повторить все отклонение и отклонение метода? Постарайтесь понять вопрос, как делают другие, вместо того, чтобы сосредоточиться на несущественных деталях, о которых я не просил. Спасибо и приветствует Уве –

Смежные вопросы