我在Puzzle.h中有以下内容
class Puzzle
{
private:
vector<int> puzzle;
public:
Puzzle() : puzzle (16) {}
bool isSolved();
void shuffle(vector<int>& );
};
然后我的Puzzle.cpp看起来像:
Puzzle::Puzzle()
{
// Initialize the puzzle (0,1,2,3,...,14,15)
for(int i = 0; i <= puzzle.size(); i++)
{
puzzle[i] = i;
}
}
// ... other methods
我在头文件中使用了错误的初始化程序列表吗?我想定义一个int的向量并将其大小初始化为16.我应该怎么做?
G ++输出:
Puzzle.cpp:16: error: expected unqualified-id before ')' token
Puzzle.cpp: In constructor `Puzzle::Puzzle()':
Puzzle.cpp:16: error: expected `)' at end of input
Puzzle.cpp:16: error: expected `{' at end of input
Puzzle.cpp: At global scope:
Puzzle.cpp:24: error: redefinition of `Puzzle::Puzzle()'
Puzzle.cpp:16: error: `Puzzle::Puzzle()' previously defined here
答案 0 :(得分:5)
问题是您在标头和.cpp文件中都定义了Puzzle::Puzzle()
,因此它有两个定义。
初始化列表可以与.cpp文件中的构造函数定义一起使用:
Puzzle::Puzzle()
: puzzle (16)
{
// ...
}
并从标题中删除定义:
Puzzle(); // I'm just a declaration now, not a definition
答案 1 :(得分:2)
主要问题是你定义构造函数两次 - 一次在头文件中,然后再在cpp文件中。删除标题中的那个并将初始化移动到cpp:
Puzzle::Puzzle()
: puzzle (16)
{
// Initialize the puzzle (0,1,2,3,...,14,15)
for(int i = 0; i <= puzzle.size(); i++)
{
puzzle[i] = i;
}
}
此外,除非你的标题{(1}} - 或更糟,using std::vector
- 在你的标题中(你不应该),你的矢量应该在标题中声明如下:
using namespace std
答案 2 :(得分:2)
您不能在两个不同的地方初始化某些内容。在标题中,只需声明它:
Puzzle();
<。>在.cpp文件中定义它:
Puzzle::Puzzle() : puzzle( 16 )
{
// Initialize the puzzle (0,1,2,3,...,14,15)
for(int i = 0; i < puzzle.size(); i++)
{
puzzle[i] = i;
}
}
虽然你可能最好不要使用初始化列表:
Puzzle::Puzzle()
{
// Initialize the puzzle (0,1,2,3,...,14,15)
for(int i = 0; i < 16; i++)
{
puzzle.push_back( i );
}
}
答案 3 :(得分:1)
您无法定义构造函数两次!所以在头文件中替换
Puzzle() : puzzle (16) {}
通过
Puzzle();
在.cpp源文件中添加
puzzle.resize(16);
在第一行。