我试图创建一个我希望在switch-case中填充的对象,但它超出了我的知识范围。
我有这些构造函数:
cObj::cObj()
{
}
cObj::cObj(std::string filename)
{
//...
}
所以,基本上我想调用以下方法,创建一个指向该对象的指针,并在我的switch-case中填充它:
void someThing() {
cObj myObj();
switch (someValue)
case 0:
myObj("/some/path");
break;
...
}
我认为我的构造函数是错误的,因为它不起作用。
我该如何做到这一点?
答案 0 :(得分: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));
...
}
答案 1 :(得分: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);
}
您还可以创建一个函数来决定使用哪个路径并返回对象: