如何修复“Expected Primary-expression before ')' token”错误?

8
这是我的代码。我一直收到这个错误信息:

错误:在“) ”标记之前期望主表达式

有人有什么想法如何解决吗?
void showInventory(player& obj) {   // By Johnny :D
for(int i = 0; i < 20; i++) {
    std::cout << "\nINVENTORY:\n" + obj.getItem(i);
    i++;
    std::cout << "\t\t\t" + obj.getItem(i) + "\n";
    i++;
}
}

std::string toDo() //BY KEATON
{
std::string commands[5] =   // This is the valid list of commands.
    {"help", "inv"};

std::string ans;
std::cout << "\nWhat do you wish to do?\n>> ";
std::cin >> ans;

if(ans == commands[0]) {
    helpMenu();
    return NULL;
}
else if(ans == commands[1]) {
    showInventory(player);     // I get the error here.
    return NULL;
}

}
2个回答

8

showInventory(player);传递了一个类型作为参数。这是非法的,您需要传递一个对象。

例如,像这样:

player p;
showInventory(p);  

我猜您有类似这样的东西:

我猜您有类似这样的东西:

int main()
{
   player player;
   toDo();
}

这是糟糕的做法。首先,不要将对象命名与您的类型相同。其次,为了使函数内部可见该对象,您需要将其作为参数传递:

int main()
{
   player p;
   toDo(p);
}

并且。
std::string toDo(player& p) 
{
    //....
    showInventory(p);
    //....
}

“player”是对象名称。我正在尝试传递对象“player”。 - Tux
1
@user1743924 真的吗?它在哪里声明的(肯定不是你发布的代码中)?实际上,showInventory(player& obj) 这一行告诉我们 player 是一种类型,而不是一个对象。 - Luchian Grigore
1
@user1743924,你把一个变量命名成了和类型一样的名字?千万别这么做。不管怎样,那个变量是在main中声明的,而不是在toDo中。你需要将它作为参数传递。 - Luchian Grigore
`int main(int argc, char *argv[]){player player;` - Tux

1
showInventory(player);     // I get the error here.

void showInventory(player& obj) {   // By Johnny :D

这意味着player是一种数据类型,showInventory需要一个指向player类型变量的引用。

因此,正确的代码将是

  void showInventory(player& obj) {   // By Johnny :D
    for(int i = 0; i < 20; i++) {
        std::cout << "\nINVENTORY:\n" + obj.getItem(i);
        i++;
        std::cout << "\t\t\t" + obj.getItem(i) + "\n";
        i++;
    }
    }

players myPlayers[10];

    std::string toDo() //BY KEATON
    {
    std::string commands[5] =   // This is the valid list of commands.
        {"help", "inv"};

    std::string ans;
    std::cout << "\nWhat do you wish to do?\n>> ";
    std::cin >> ans;

    if(ans == commands[0]) {
        helpMenu();
        return NULL;
    }
    else if(ans == commands[1]) {
        showInventory(myPlayers[0]);     // or any other index,also is not necessary to have an array
        return NULL;
    }

}

完全同意你的观点,但是当你在C风格中有全局函数时,拥有全局对象也不是那么糟糕。 - Adrian Herea
在C++代码中有任何C风格的东西都不好,对吧...这太糟糕了。 - Luchian Grigore
其实不是这样的,这就是为什么在C++中我们有类。你可以拥有一个PlayersManager类来处理球员并且有getter/setter或者其他类似的东西。 - Adrian Herea
我在头文件中有很多全局函数,并且我已经将它们全部包含了。我应该做些不同的事情吗?比如将它们放在一个类中,这样我就不会出现命名空间错误了吗? - Tux
面向对象编程的主要思想之一是封装。从这个角度来看,至少从维护的角度来看,生活会更容易。 - Adrian Herea
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接