Чем отличается конструктор вызовов от новой перегрузки и напрямую?

Учитывая код ниже, когда я звоню new(name, 10) Foo() Я ожидаю, что произойдет следующее в таком порядке:

  1. void* operator new(std::size_t size, QString name, int id) перегрузка должна быть вызвана
  2. Foo(QString name, int 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;

2

Решение

Foo *f = new (name, 10) Foo;
выделяет память используя перегруженный ǹew оператор и после этого инициализирует память с созданным по умолчанию Foo (который только перезаписывает name но нет id поскольку id не инициализируется в конструкторе defualt).

Вы можете увидеть это, разместив, например, qDebug() << __PRETTY_FUNCTION__; в конструкторах Фу.

Увидеть ТАК за похожий вопрос.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector