1

こんにちは、C++03で次のようなことができるのだろうかと思っています。試しましたが、うまくいきません。

struct SomeClass{
int a,b,c,d;
};

SomeClass * temp  = new SomeClass();
*temp = { 1,2,3,4};

私はそれをしましたが、コンパイラーは拡張イニシャライザーがC ++ 11でのみサポートされているという警告を出し
ます。オブジェクトを作成するためにnewを使用するときに二重中括弧のイニシャライズを使用する他の方法はありますか?コンストラクターは許可されていません

4

2 に答える 2

4

これをC++03で直接実行できるとは思いませんが、「クラス外コンストラクター」と考えることができるものを使用して、ブルートフォース攻撃と比較して(おそらく)ジョブを単純化できます。

struct someclass{
    int a, b, c, d;
};

someclass make(int a, int b, int c, int d) { 
    someclass ret = {a, b, c, d};
    return ret;
}

int main(){
    someclass *s = new someclass();

    *s = make(1, 2, 3, 4);
}

かなり最近の(そしておそらく最も古い)C ++コンパイラが関数呼び出しをインライン化するのは非常に簡単なことです。そのため、関数呼び出しによってオーバーヘッドが発生することはありません。必要に応じて、関数をテンプレートに変換し、さまざまな数のパラメーターに対してオーバーロードして、次のようなことを行うこともできます。

someclass *s = new someclass();

*s = make<someclass>(1, 2, 3, 4);

otherclass *o = new otherclass();

*o = make<otherclass>(1, 2);

ただし、最終的には、ここでの大きな問題は、間違った足で始めていることです。(少なくとも)来年または2年は、C++にnew式があることを忘れてしまう可能性があります。あなたがそれを必要としているように感じることは(特にこのような場合)、あなたがまだC ++にうまく適応しておらず、まだJavaを書き込もうとしていることのかなり良い兆候です。

于 2013-02-05T07:45:27.943 に答える
1

技術的には最新C++ですC++11

とにかく、あなたがしていることはなしでは不可能C++11です。構造体または配列を作成する場合にのみ、中括弧で初期化できます。

すなわち

SomeClass temp = { 1,2,3,4 };

編集:C ++でのサポートを確認する必要がありますが、これはC99で、複合リテラルと呼ばれるものを使用することで可能になるようです。

SomeClass temp;

temp = ((SomeClass){1,2,3,4});

Edit2-葉巻なし-source.cpp:9:31: warning: ISO C++ forbids compound-literals [-pedantic]

他の誰かも同じ問題を抱えていたようです

于 2013-02-05T07:09:04.477 に答える