質問

私は、既存のコードのこの例では、C ++ 0xの初期化子リストの機能を利用することができるだろうかを確認したいと思います。

Example0ます:

#include <vector>
#include <string>
struct Ask {
    std::string prompt;
    Ask(std::string a_prompt):prompt(a_prompt){}
};
struct AskString : public Ask{
    int min;
    int max;
    AskString(std::string a_prompt, int a_min, int a_max):
        Ask(a_prompt), min(a_min), max(a_max){}
};
int main()
{
    std::vector<Ask*> ui;
    ui.push_back(new AskString("Enter your name: ", 3, 25));
    ui.push_back(new AskString("Enter your city: ", 2, 25));
    ui.push_back(new Ask("Enter your age: "));
}

それはこのようなものをサポートしています。

例1:

std::vector<Ask*> ui ={
    AskString("Enter your name: ", 3, 25),
    AskString("Enter your city: ", 2, 25),
    Ask("Enter your age: ")
    };

それとも、それはこのようなリテラルを持っている必要があります。?

例2:

std::vector<Ask*> ui ={
    {"Enter your name: ", 3, 25},
    {"Enter your city: ", 2, 25},
    {"Enter your age: "}
    };

もしそうAskStringと依頼の違いがどのように処理されるか?

役に立ちましたか?

解決

あなたの最後の例では、ポインタを求める代わりに、ローカルの一時オブジェクトを提供しようとすることは許されないでしょう。

std::vector<Ask*> ui ={
    new AskString{"Enter your name: ", 3, 25},
    new AskString{"Enter your city: ", 2, 25},
    new Ask{"Enter your age: "}
    };

これは許されると全くタイプのあいまいさもないでしょう。

それはあまりにも右になります:

std::vector<Ask*> ui ={
        new AskString("Enter your name: ", 3, 25),
        new AskString("Enter your city: ", 2, 25),
        new Ask("Enter your age: ")
        };

そして、あなたの例では、より多くのようなものです。

std::vector<Ask> ui ={  // not pointers
    {"Enter your name: "},
    {"Enter your city: "},
    {"Enter your age: "}
    };

std::vector<AskString> uiString ={  // not pointers
    {"Enter your name: ", 3, 25},
    {"Enter your city: ", 2, 25},
    {"Enter your age: ", 7, 42}
    };

と再び種類には曖昧さはないだろう。

他のヒント

A、C ++初期化子リストは、の均質の、例えば、#2が出ているので、それは、すべて同じ型を持たなければならないという意味です。あなたは例1でnewを使用した場合、それが働くだろう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top