1

我想将游戏类分成标题和源。为此,我需要能够在类外定义函数,但奇怪的是,我不能!

主文件

#include "app.hpp"
int main ()
{
    Game game(640, 480, "Snake");
    game.run();
    return 0;
}

应用程序.hpp

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
class App
{
    friend class Game;
    public:
             App(const int X, const int Y, const char* NAME);
        void run(void);
    private: // Variables
        sf::RenderWindow window;
        sf::Event         event;
        sf::Keyboard     kboard;
};
#include "game.hpp"

现在是问题部分。

游戏.hpp .

class Game // this snippet works perfectly
{
    public:
             Game(const int X, const int Y, const char* TITLE) : app(X, Y, TITLE)
             { /* and the initialization of the Game class itself... */}
        void run()
             { app.run(); /* And the running process of Game class itself*/};
    private:
        App app;
};


class Game // this snippet produces compiler errors of multiple definitions...
{
    public:
             Game(const int X, const int Y, const char* TITLE);
        void run();
    private:
        App app;
};
Game::Game(const int X, const int Y, const char* TITLE) : app(X, Y, TITLE) {}
void Game::run() { app.run(); } // <<< Multiple definitions ^^^

为什么?

4

2 回答 2

6

多重定义错误的原因是什么?

因为您在头文件中定义函数,并且当您将头文件包含在翻译单元中时,会在每个翻译单元中创建函数的副本,从而导致多个定义和违反一个定义规则

解决办法是什么?

您可以在 cpp 文件中单独定义这些函数。您在头文件中声明函数并在源 cpp 文件中定义它们。

为什么第一个例子有效?

绕过一个定义规则的唯一符合标准的方法是使用inline函数。当您在类体内定义函数时,它们是隐式inline的,程序可以成功绕过一个定义规则和多个定义链接错误。

于 2014-01-03T15:26:26.673 回答
2

因为你定义class Game了两次。以下是你如何布置分隔:

类.hpp

class Class
{
    public:
        Class();
        void foo();
};

类.cpp

Class::Class() { //Do some stuff}
void Class::foo() { //Do other stuff }
于 2014-01-03T15:30:55.670 回答