2

我正在尝试创建一个要填充到开关盒中的对象,但这超出了我的知识范围。

我有这些构造函数:

cObj::cObj()
{
}

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

所以,基本上我想调用下面的方法,创建一个指向对象的指针,并将它填充到我的 switch-case 中:

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 回答