2016-03-04 47 views
2

考慮下面的代碼,當我打電話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; 
+0

http://en.cppreference.com/w/cpp/language/new –

+0

新操作符中的額外參數應該用來選擇內存管理策略。這在實現自定義容器時很有用,該容器將擁有內存。這個值不應該用來初始化對象。 –

+0

@MarekR:傳遞給new運算符的參數與傳遞構造函數以創建對象的參數完全相同,因此我只傳遞它一次 – Jack

回答

0

Foo *f = new (name, 10) Foo; 分配使用重載ǹew操作內存和初始化後默認構建的內存Foo(其中只有ov因爲id未在defualt構造函數中初始化,所以它會寫name但不是id)。

你可以看到,在Foo的構造函數中使用qDebug() << __PRETTY_FUNCTION__;

請參閱SO對於類似的問題。

+0

您在談論C++生成的一個還是我的哪一個默認構造函數?我不明白'name'值是如何過度的,'id'沒有。兩者都設置在構造函數'Foo(QString,int)' – Jack

+0

'Foo * f = new(name,10)Foo;'調用您的構造函數'Foo()'; 'Foo * f = new(name,10)Foo(name,10);'會調用'Foo(QString,int)'構造函數。 – Flopp

+0

我試圖從'void *運算符new(std :: size_t size,QString name,int id)''overload'調用'Foo(QString,int)'構造函數初始化成員。在調用Foo()時,該值應該已經被設置,所以它什麼都不做。 – Jack

相關問題