无法在类之外定义类函数
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
【讨论】:
以上是关于无法在类之外定义类函数的主要内容,如果未能解决你的问题,请参考以下文章