如何初始化我在头文件中定义的向量?

时间:2010-04-18 20:26:41

标签: c++ vector header initialization

我在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

4 个答案:

答案 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);

在第一行。