2

スイッチケース内に入力したいオブジェクトを作成しようとしていますが、それは私の知識範囲外です。

私はこれらのコンストラクタを持っています:

cObj::cObj()
{
}

cObj::cObj(std::string filename)
{
    //...
}

したがって、基本的には、次のメソッドを呼び出し、オブジェクトへのポインターを作成し、スイッチ ケース内に入力します。

void someThing() {
    cObj myObj();

    switch (someValue)
        case 0:
            myObj("/some/path");
            break;
        ...
}

実際には機能しないため、コンストラクターが間違っていると思います。

どうすればこれを達成できますか?

4

2 に答える 2

4

これにはポインターは必要ありません。

void someThing() {
    cObj myObj; // Don't use parentheses for the default constructor.
                // What you had was a function declaration, not an object creation.

    switch (someValue) {
        case 0:
            myObj = cObj("/some/path");
            break;
        ...
}

デフォルトのコンストラクターがない場合、またはそれを呼び出したくない場合は、できればスマートなポインターを使用できます。

void someThing() {
    std::unique_ptr<cObj> myObj;

    switch (someValue) {
        case 0:
            myObj.reset(new cObj("/some/path"));
            break;
        ...
}

または、lmmilewski が示唆したように、決定を関数に分解して、オブジェクトを返すこともできます。

cObj choose(someType someValue) {
    switch (someValue) {
        case 0:
            return cObj("/some/path");
        ...
}

void someThing() {
    cObj myObj(choose(someValue));
    ...
}
于 2012-05-25T18:41:40.180 に答える
3

この行でオブジェクトを作成すると

cObj myObj();

(ところで、おそらくこれらの括弧は必要ありません。関数を宣言するのではなく、オブジェクトを作成したいのです)。

コンストラクターを呼び出します。switch文で再度呼び出すことはできません。別のメソッドを作成できます。

cObj::cObj()
{
}

void cObj::SetFilename(const std::string& filename) {
// ...
}

そのように使用します:

void someThing() {
    cObj myObj;

    switch (someValue)
        case 0:
            myObj.SetFilename("/some/path");
            break;
        ...
}

何をしようとしているのかわかりませんが、最初にファイルパスを特定してからオブジェクトを作成する方がよいでしょうか?

void someThing() {
    std::string filepath = "default/path";

    switch (someValue)
        case 0:
            filepath = "some/path";
            break;
        ...

    cObj myObj(flepath);
}

また、使用するパスを決定してオブジェクトを返す関数を作成することもできます。

于 2012-05-25T18:46:21.757 に答える