2017-09-13 65 views
2

我發現這個代碼,我不明白,爲什麼它在項目中工作。代碼的結構爲:(被我加入內符號以創建更小的例子在源MYSTRUCT是一個指針。)用兩個參數調用新操作符,但沒有賦值

class MyClass { 
    int value; 
}; 

struct MyStruct { 
    MyClass classA; 
    MyClass classB; 
}; 

int main() { 

    MyStruct myStruct; 

    new (&((&myStruct)->classA)) MyClass(); 
    new (&((&myStruct)->classB)) MyClass(); 
} 

編譯器說

In function int main() 
error: no matching function for call to ‘operator new(sizetype, MyClass*)’ 
    new (&((&myStruct)->classA)) MyClass(); 
             ^
note: candidates are: 
note: void* operator new(long unsigned int) 
note: candidate expects 1 argument, 2 provided 

也許我失去了一些重要的東西。這是一個大項目,我無法複製它。我無法創建MWE。我希望有人能向我解釋這個代碼背後的主要思想,以及我爲了編譯它而必須改變的內容。

+4

查找[_placement'new'_(http://en.cppreference.com/w/cpp/memory/new/operator_new )。 – user0042

+0

它在兩個MyClass變量中創建一個MyClass類的新實例結構MyStruct的實例myStruct包含 –

+5

這個(&myStruct) - >'沒有任何意義。或者至少我希望它沒有。 – Quentin

回答

4

Placement new是那些C++語言特性之一,它需要在包含合適的頭部之前才能嘗試使用它們。

使用放置位置new時,表達式必須調用operator new的超載作爲其評估的一部分。 過載,確切的說:

void* operator new (std::size, void*); 

但此功能不會自動在每一個翻譯單元中聲明爲您服務。因此,要將其拉入,您必須包含正確的標題(<new>)。


作爲一個側面說明,您展示的代碼非常破碎。它構建了myStruct兩次的成員!對於非平凡的案件可能破壞浩劫。

正確的方法很明確初始化myStruct是這樣的:

MyStruct myStruct { 
    {}, // Default construct classA 
    {} // Default construct classB 
}; 
+0

好答案 - 附註;甚至不需要顯式初始化。它自己的默認構造函數將使對象保持相同的狀態 - 在本例中。 – UKMonkey

+0

@UKMonkey - 的確如此。因此,我關於這個問題的提問非常**明確*初始化:) – StoryTeller

相關問題