-1

クラス内に反映された主な変更にポインタを保持する最良の方法は?

static unsigned char tmp[][20] = {"hello world", "bye world"};

class X {       
    unsigned char ** buffer;

public:
    X(unsigned char* buff)
    {
        buffer = &buff;
    }

    void printThis()
    {
        DBG_MSG_FORMATED(".......> %s", *buffer);
    }
};


int main (int argc, char * const argv[]) {
    unsigned char * buff = new unsigned char[20];
    memcpy(buff, tmp[0], 12);
    X x(buff);
    x.printThis();
    memcpy(buff, tmp[1], 12);
    x.printThis();
    delete [] buff;

    return EXIT_SUCCESS;
}

これは機能しますが、次のことを行うと

buff = tmp[0];
x.printThis();

印刷物に hello world が再び印刷されない??? それを修正する方法

4

3 に答える 3

3

クラスでポインターへのポインターを使用する必要があります ( gulp !):

class X {

    unsigned char ** buffer;

public:
    X(unsigned char** buff)
    {
        buffer = buff;
    }

    void printThis()
    {
        DBG_MSG_FORMATED(".......> %s", *buffer);
    }
};

そして、構築中にポインターのアドレスを渡します。

X x(&buff);
于 2013-07-04T15:16:21.990 に答える
1
int main (int argc, char * const argv[]) {
    unsigned char * buff = new unsigned char[20];
    memcpy(buff, tmp[0], 12);
    X x(buff);
    x.printThis();
    delete [] buff;

    buff = tmp[1];  
    x.printThis();

    return EXIT_SUCCESS;
}

完了後、クラス内のdelete buff;ポインタbufferは削除されたメモリを指していますが、これは非常に悪いニュースです。

の実際のアドレスを保存したい場合はbuff、次のように のアドレスを渡してbuff保存する必要があります。

char **buffer;
X(unsigned char** buff)
{
    buffer = buff;
}

void printThis()
{
    DBG_MSG_FORMATED(".......> %s", *buffer);
}

... X x(&buff);

bufferまたは、次への参照を作成できますbuff

char*& buffer;
X(unsigned char*& buff) : buffer(buff) {}

buffer = some_other_buffer;(クラスやその他のコードで他の変更は必要ありません。ただし、後の段階ではできないことに注意してください。これにより、 bufftoの値が変更some_other_bufferされます。これは、おそらく期待したものではありません)。

于 2013-07-04T15:17:51.360 に答える