C++ 预期的左大括号以及重定义错误

c++ expected opening brace as well as redefinition error

本文关键字:定义 错误 C++      更新时间:2023-10-16

所以我尝试在 .h 文件中定义我的类并在 cpp 文件中编写构造函数,如下所示:

.h 文件:

class Player : protected Character{
public:
Player(sf::Vector2f starting_pos, std::list<Object *> *around) : Character(around);

.cpp文件:

Player::Player(sf::Vector2f starting_pos, std::list<Object *> *around){
//code
}

现在编译器给出这两个错误:

character.h:25:90: error: expected ‘{’ at end of input
25 |         Player(sf::Vector2f starting_pos, std::list<Object *> *around) : Character(around);

character.cpp:3:1: error: redefinition of ‘Player::Player(sf::Vector2f, std::__cxx11::list<Object*>*)’
3 | Player::Player(sf::Vector2f starting_pos, std::list<Object *> *around){
| ^~~~~~

所以在我看来,它希望我在 .h 文件中定义代码,然后抱怨我没有在 .cpp 文件中这样做。如果我将代码直接放在 .h 文件中,它可以工作,但我不想这样做。

我不确定这些是否与此有关,所以这里有一些更多信息:

字符是从对象继承的抽象类,玩家继承自角色。另外:cpp 文件中有第二个错误,指出在此上下文中无法访问该对象。

我发现很多人缺少右牙套,但没有遗漏左牙套。

感谢您的任何帮助

在你的头文件中,你有

Player(sf::Vector2f starting_pos, std::list<Object *> *around) : Character(around);

这导致了错误。由于您在此处使用初始值设定项列表,因此编译器也希望完整的函数定义也在那里。只需从该行中删除Character的初始值设定项,然后将其移动到 C++ 文件中即可。

.h 文件

Player(sf::Vector2f starting_pos, std::list<Object *> *around);

.cpp文件

Player::Player(sf::Vector2f starting_pos, std::list<Object *> *around) : Character(around) {
//code
}

你的 ctor-initialiser 使用构造函数的定义,而不是声明

你混淆了编译器,通过[有效地]编写一个定义(它必须是一个定义,因为它上面有ctor-initialiser(没有{}(因为你的意思是让它成为一个声明(......然后提供[另一个]定义。