C++ 对“Class::Class”的未定义引用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5393293/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Undefined reference to 'Class::Class'
提问by James
After fixing the previous problem (see my one other question that I have asked). I had declared more classes.
解决上一个问题后(请参阅我提出的另一个问题)。我已经声明了更多的课程。
One of these is called CombatAdmin
which does various things: (Header file)
其中之一称为CombatAdmin
执行各种操作:(头文件)
#ifndef COMBATADMIN_H
#define COMBATADMIN_H
#include <string> // Need this line or it complains
#include <Player.h>
#include <Sound.h>
#include <Enemy.h>
#include <Narrator.h>
using namespace std;
class Enemy;
class Player;
class CombatAdmin // Code yet to be commented here, will come soon.
{
public:
CombatAdmin();
void healthSet(double newHealth, string playerName);
void comAdSay(string sayWhat);
void playerFindsChest(Player *player,Weapon *weapon,Armour *armour);
void youStoleOurStuffEncounter(Player *player);
void comAdWarning(string enemyName);
void comAdAtkNote(string attack, double damage,string target,string aggresor);
void entDefeated(string entName);
void comAdStateEntHp(string ent, double hp);
void comAdStateScanResults(string enemyName, double enemyHealth);
string doubleToString(double number);
string intToString(int number);
bool isRandEncounter();
void randomEncounter(Player *player,Sound *sound,Narrator *narrator);
bool combatRound(Player *player, Enemy *enemy, Sound *sound, bool ran);
void playerFindsItem(string playerName,string itemName,double itemWeight,double playerWeight);
void playerFindsGold(string playerName,double coinCnt,double playerCoinCnt);
};
#endif // COMBATADMIN_H
It is then instanced in the main.cpp
file like this: (Snippet of the main.cpp
file)
然后main.cpp
像这样在文件中实例化:(main.cpp
文件的片段)
#include <iostream> // Required for input and output
#include <Item.h> // Item header file.
#include <Weapon.h> // Header files that I have made for my classes are needed for this program
#include <sstream> // Needed for proper type conversion functions
#include <windows.h> // for PlaySound() and other functions like sleep.
#include <time.h> // Needed to seed the rand() function.
#include <mmsystem.h> // Not sure about this one, possibly defunct in this program.
#include <stdio.h> // Needed for a similar kind of output as iostream for various functions error msgs.
#include <irrKlang.h> // The header file of the sound lib I am using in this program.
#include <Narrator.h> // The narrators's header file.
#include <Pibot.h> // Other header files of classes.
#include <Armour.h>
#include <Player.h>
#include <Weapon.h>
#include <CombatAdmin.h>
using namespace irrklang;
using namespace std;
// Forward referenced functions
void seedRandom(); // Seeds the random number so it will be random as apposed to pseudo random.
string getPlayerName(string temp); // Gets the player's new name.
int main(int argc, char* argv[])
{
// Variables and object pointers declared here.
CombatAdmin *comAd = new CombatAdmin(); // Handles combat.
Narrator *narrator = new Narrator(); // The Narrator that says stuff
Pibot *piebot = new Pibot(); // PIbot, the player's trusty companion
string temp; // Temp string for input and output
However, when I try to compile the project, I get the following error:
但是,当我尝试编译项目时,出现以下错误:
C:\Documents and Settings\James Moran.HOME-B288D626D8\My Documents\C++ projects\Test Project\main.cpp|59|undefined reference to `CombatAdmin::CombatAdmin()'|
I am using the Code::Blocks IDE (ver 10.05), with the GNU GCC compiler. The project is of type "Console application". I am using windows XP 32 bit SP3.
我正在使用带有 GNU GCC 编译器的 Code::Blocks IDE(10.05 版)。该项目属于“控制台应用程序”类型。我使用的是 Windows XP 32 位 SP3。
I have tried changing to search directories to include where the object files are, but no success there.
我尝试更改搜索目录以包含目标文件所在的位置,但没有成功。
As can be seen from the code, the narrator and PIbot
are instanced just fine. (then used, not shown)
从代码中可以看出,narrator 和PIbot
实例化得很好。(然后使用,未显示)
My question is, therefore, what do I need to do to stop these errors occurring? As when I encountered similar "Undefined reference to x" errors before using libraries. I had just forgotten to link to them in Code::Blocks and as soon as I did, they would work.
因此,我的问题是,我需要做什么来阻止这些错误的发生?就像我在使用库之前遇到类似的“未定义对 x 的引用”错误一样。我刚刚忘记在 Code::Blocks 中链接到它们,一旦我这样做了,它们就会起作用。
As this class is of my own making I am not quite sure about this.
由于这门课是我自己制作的,我对此不太确定。
Do say if you need more information regarding the code etc.
如果您需要有关代码等的更多信息,请务必说。
回答by zvrba
You have declared the default constructor (CombatAdmin()) and thus prevented the compiler from automatically generating it. Thus, you either need to 1) remove declaration of the default constructor from the class, or 2) provide an implementation.
您已声明默认构造函数 (CombatAdmin()),从而阻止编译器自动生成它。因此,您需要 1) 从类中删除默认构造函数的声明,或者 2) 提供一个实现。
回答by Vincent Vilain
I had this kind of error and the cause was that the CombatAdmin.cpp file wasn't selected as a Build target file: Prject->Properties->Build targets
我有这种错误,原因是 CombatAdmin.cpp 文件没有被选为 Build 目标文件:Prject->Properties->Build targets
回答by Nawaz
Are you sure you've to include your header as:
您确定必须将标题包含为:
#include <CombatAdmin.h>
?
?
I think you need to include your header file as:
我认为您需要将头文件包含为:
#include "CombatAdmin.h"
And same for other headers written by you, like these:
对于您编写的其他标题也是如此,如下所示:
#include "Armour.h"
#include "Player.h"
#include "Weapon.h"
//and similarly other header files written by you!
See this topic:
请参阅此主题:
What is the difference between #include <filename> and #include "filename"?
回答by Shiva
My solution was just to add a line in the header before the class defenition:
我的解决方案只是在类定义之前在标题中添加一行:
class CombatAdmin;
类 CombatAdmin;