无法在类之外定义类函数

Posted

技术标签:

【中文标题】无法在类之外定义类函数【英文标题】:Can't define class functions OUTSIDE class 【发布时间】:2014-01-03 15:24:33 【问题描述】:

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

main.cpp

#include "app.hpp"
int main ()

    Game game(640, 480, "Snake");
    game.run();
    return 0;

app.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"

现在是问题部分。

game.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 ^^^

为什么?

【问题讨论】:

【参考方案1】:

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

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

解决办法是什么?

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

为什么第一个例子有效?

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

【讨论】:

+1。第一个版本有效,因为定义是隐式内联的。【参考方案2】:

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

类.hpp

class Class

    public:
        Class();
        void foo();
;

类.cpp

Class::Class()  //Do some stuff
void Class::foo()  //Do other stuff 

【讨论】:

以上是关于无法在类之外定义类函数的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 MooseX::Declare 在类之外定义函数吗?

我可以在类之外定义私有模板函数吗?

如何在模板类之外定义构造函数[重复]

模板化类的模板化成员方法可以在类定义之外定义吗

模板实现顺序表

类--其他特性,作用域,构造函数,静态成员