2017-09-13 8 views
2

このコードは見つかりましたが、プロジェクトでなぜこのコードが動作するのか分かりません。コードの構造は以下の通りである:2つの引数を持ちながら代入なしでnew演算子を呼び出す

class MyClass { 
    int value; 
}; 

struct MyStruct { 
    MyClass classA; 
    MyClass classB; 
}; 

int main() { 

    MyStruct myStruct; 

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

(インナーアンパサンドが小さい例を作成するために、私が追加されたソース体mystruct内のポインタです。)。

コンパイラは、たぶん私は重要な何かが欠けてい

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

これは2つの 'MyClass'変数に' MyClass'クラスの新しいインスタンスを作成しています。 'MyStruct'構造体の' myStruct'には –

+5

が含まれています。この '(&myStruct) - >'は意味がありません。少なくとも、私はそれがしないことを願っています。 – Quentin

答えて

4

Placement newは、それらを使用する前に適切なヘッダーを含める必要があるC++言語機能の1つです。

プレースメントnewを使用する場合、式は評価の一部としてoperator newのオーバーロードを呼び出す必要があります。 この過負荷、正確には:

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

しかし、この機能は自動的に全ての翻訳単位であなたのために宣言されていません。そのためには、正しいヘッダー(<new>)を含める必要があります。


あなたが示したコードは非常に壊れています。 myStructの2つをのメンバーに構成します。それは、自明ではないケースのために大混乱を引き起こす可能性があります。

非常に明示的myStructを初期化する適切な方法は、このようなものです:

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

良い答え - サイドノート;明示的な初期化は必要ない。それ自身のデフォルトのコンストラクタはオブジェクトを同じ状態(この例の場合)のままにします。 – UKMonkey

+0

@UKMonkey - それは本当です。したがって、これについて***私の口笛は非常に**明示的に*初期化:) – StoryTeller

関連する問題