Как мне инициализировать вектор, который я определил в моем заголовочном файле? - PullRequest
0 голосов
/ 19 апреля 2010

У меня есть следующее в 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

Я неправильно использую список инициализаторов в моем заголовочном файле? Я хотел бы определить вектор целых и инициализировать его размер равным 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 ]

5 голосов
/ 19 апреля 2010

Проблема в том, что вы определили Puzzle::Puzzle() в заголовке и в файле .cpp, поэтому у него есть два определения.

Список инициализаторов может соответствовать определению конструктора в файле .cpp:

Puzzle::Puzzle()
    : puzzle (16)
{
    // ...
}

и удалите определение из заголовка:

Puzzle(); // I'm just a declaration now, not a definition
2 голосов
/ 19 апреля 2010

Вы не можете инициализировать что-то в двух разных местах. В шапке просто объявите это:

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 );
    }
}
2 голосов
/ 19 апреля 2010

Основная проблема в том, что вы определяете свой конструктор дважды - один раз в заголовке, затем снова в файле 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;
    }
}

Более того, если вы не using std::vector - или хуже, using namespace std - в вашем заголовке (чего не следует делать), ваш вектор должен быть объявлен в заголовке так:

    std::vector<int> puzzle;
1 голос
/ 19 апреля 2010

Вы не можете определить конструктор дважды! Так что в шапке файла замените

Puzzle() : puzzle (16) {}

от

Puzzle();

А в исходный файл .cpp добавить

puzzle.resize(16);

в первой строке.

...