2

以下のコードを考慮すると、呼び出すnew(name, 10) Foo()と、次のことがこの順序で起こると予想されます。

  1. void* operator new(std::size_t size, QString name, int id)呼び出されるオーバーロード
  2. Foo(QString name, int id)この時点でオーバーロードの上からコンストラクターが呼び出されると、クラスに十分なメモリが割り当てられるため、安全に実行および設定できます。

    名前(名前)、id(id)

  3. Foo()空のコンストラクターを呼び出して何もしません。ここでのみ実装する必要があります。

しかし、私は何かが欠けています。メンバー名の値が空です。誰かが何をどのように修正するかを説明してくれますか?

コード:

注: QString は Qt のQString型です

class Foo
{
public:
    QString name;
    int id;

    // The idea is return an already existing instance of a class with same values that
    // we are going to construct here.
    void* operator new(std::size_t size, QString name, int id)
    {
        Foo *f = getExistingInstance(name, id);

        if(f != NULL)
            return f;

        /* call to constructor Foo(QString, int) is an alias for:
         *      Foo* *p = static_cast<Foo*>(operator new(size));
         *      p->name = name;
         *      p->id = id;
         *      return p;
         * I don't think it's wrong on ambiguos in the below call to constructor, since it does use
         * operator new(std::size_t size) and Foo(QString name, int id) "methods"
         */
        return new Foo(name, id);
    }

    void* operator new(std::size_t size)
    {
        void *ptr = malloc(size);
        assert(ptr);
        return ptr;
    }

    Foo(QString name, int id)
        : name(name),
          id(id)
    {

    }

    Foo()
    {

    }

    ~Foo()
    {

    }

    QString toString()
    {
        return QString("name = %1, id = %2")
                .arg(name)
                .arg(id);
    }

    static Foo* getExistingInstance(QString name, int id)
    {
        /* not implemented yet */
        return NULL;
    }
};

これをどのように呼ぶか:

 QString name = "BILL";
 Foo *f = new(name, 10) Foo();
 qDebug() << f->toString(); //output "name = , id = 10"
 delete f;
4

1 に答える 1