C ++。具有更改参数的类

时间:2013-06-03 11:35:20

标签: c++ class parameters

我有一个包含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,或者其中一个变为整数,例如),是否有必要创建一个新类,或者我可以使用现有的一,做一些“类型转换”或其他一些我还不知道的技巧?

谢谢和问候

乌韦

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您的代码中有很多位置,应该在进一步操作之前修复。

  1. 命名惯例太糟糕了。什么是abc

  2. 您使用b作为循环索引器,而应在那里使用局部变量。

  3. 您没有向我们展示 a。在哪里分配? a指向的内存大小是多少?

  4. 我想,您的代码应如下所示:

    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?
    

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

答案 2 :(得分: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);