0

我有一个有 3 个私有变量和一个公共方法的类,它有 2 个 char 参数变量。

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;
}

现在我的问题是:如果我希望使用不同的参数类型(*a 和 c,或者其中一个变成整数,例如)重复相同的操作,是否有必要创建一个新类,或者我可以使用现有的,做一些“类型转换”或其他一些我还不知道的技巧?

谢谢并恭祝安康

乌韦

4

3 回答 3

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?

这些只是我在阅读您的问题时想到的事情。如果这不是您所要求的,请考虑将问题编辑得更具体。

于 2013-06-03T11:49:36.360 回答
1

使用模板,使 Init 函数成为您的参数类型的模板。

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

例如

于 2013-06-03T11:37:56.200 回答
0

如果你只是想让整个类具有不同的类型(不仅仅是 Init),例如也有 int *a; 诠释 b, c; 那么模板类是你还不知道的另一个技巧。

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);
于 2013-06-03T11:41:59.247 回答