考慮下面的代碼,當我打電話new(name, 10) Foo()
我希望以下的情況發生,按照這個順序:從新的過載和直接調用構造函數有什麼區別?
void* operator new(std::size_t size, QString name, int id)
過載被稱爲Foo(QString name, int id)
構造函數在這個時候從上面過載 叫,足夠的內存分配給我的課,所以我可以放心地做,並設置:姓名(名稱),身份證(ID)
電話
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;
http://en.cppreference.com/w/cpp/language/new –
新操作符中的額外參數應該用來選擇內存管理策略。這在實現自定義容器時很有用,該容器將擁有內存。這個值不應該用來初始化對象。 –
@MarekR:傳遞給new運算符的參數與傳遞構造函數以創建對象的參數完全相同,因此我只傳遞它一次 – Jack