0

3 つのプライベート変数と 2 つの char パラメータ変数を持つ 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;
}

ここで私の質問は次のとおりです。異なるパラメータータイプ (*a と c、またはそのうちの 1 つが整数になるなど) で同じアクションを繰り返したい場合、新しいクラスを作成する必要がありますか、それとも既存のクラスを使用できますか? 「タイプキャスト」または私がまだ知らない他のトリックですか?

感謝と敬意

ウーヴェ

4

3 に答える 3

1

コードには多くの場所があり、それ以上の操作を行う前に修正​​する必要があります。

  1. 命名規則はひどいです。ab、とは何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 に答える