首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何初始化头文件中定义的向量?

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

Stack Overflow用户
提问于 2010-04-19 04:26:41
回答 4查看 7.1K关注 0票数 0

我的Puzzle.h中有以下内容

代码语言:javascript
复制
class Puzzle
{
    private:
        vector<int> puzzle;
    public:
        Puzzle() : puzzle (16) {}
        bool isSolved();
        void shuffle(vector<int>& );
};

然后我的Puzzle.cpp看起来像这样:

代码语言:javascript
复制
Puzzle::Puzzle()
{
    // Initialize the puzzle (0,1,2,3,...,14,15)
    for(int i = 0; i <= puzzle.size(); i++)
    {
        puzzle[i] = i;
    }
}

// ... other methods

我是否在我的头文件中使用了错误的初始化器列表?我想定义一个整数向量,并将其大小初始化为16,我该怎么做呢?

G++输出:

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-19 04:30:12

问题是您在头文件和.cpp文件中都定义了Puzzle::Puzzle(),所以它有两个定义。

初始化器列表可以与.cpp文件中的构造函数定义一起使用:

代码语言:javascript
复制
Puzzle::Puzzle()
    : puzzle (16)
{
    // ...
}

并从标题中删除定义:

代码语言:javascript
复制
Puzzle(); // I'm just a declaration now, not a definition
票数 5
EN

Stack Overflow用户

发布于 2010-04-19 04:29:08

主要的问题是你定义了两次构造函数--一次在头文件中,一次在cpp文件中。删除header中的一个,并将初始化移至cpp:

代码语言:javascript
复制
Puzzle::Puzzle()
: puzzle (16)
{
    // Initialize the puzzle (0,1,2,3,...,14,15)
    for(int i = 0; i <= puzzle.size(); i++)
    {
        puzzle[i] = i;
    }
}

此外,除非你在你的头中是using std::vector -或者更糟,using namespace std -在你的头中(你不应该这样),你的向量应该这样在头中声明:

代码语言:javascript
复制
    std::vector<int> puzzle;
票数 2
EN

Stack Overflow用户

发布于 2010-04-19 04:31:45

你不能在两个不同的地方初始化一些东西。在标题中,只需声明它:

代码语言:javascript
复制
Puzzle();

在.cpp文件中对其进行定义:

代码语言:javascript
复制
Puzzle::Puzzle() : puzzle( 16 )
{
    // Initialize the puzzle (0,1,2,3,...,14,15)
    for(int i = 0; i < puzzle.size(); i++)
    {
        puzzle[i] = i;
    }
}

尽管不使用初始化列表可能会更好:

代码语言:javascript
复制
Puzzle::Puzzle() 
{
    // Initialize the puzzle (0,1,2,3,...,14,15)
    for(int i = 0; i < 16; i++)
    {
        puzzle.push_back( i );
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2663814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档