C++ 中的多个定义 (Visual Basic 2010)
Posted
技术标签:
【中文标题】C++ 中的多个定义 (Visual Basic 2010)【英文标题】:Multiple Definitions in C++ (Visual Basic 2010) 【发布时间】:2015-04-23 06:11:47 【问题描述】:我正在尝试在空闲时间练习一些编码(结合我的许多不同兴趣以帮助自己保持参与)并且我遇到了一个奇怪的错误,我找不到答案。我正在使用 4 个文件,两个头文件,一个类定义文件和一个主文件。我相当有信心我不会多次包含 Dice.h 文件(但是这是错误指向的地方,我不再确定,因此这个问题)。我在这里搞砸了什么导致这些错误?
错误代码
错误 3 错误 LNK1169:找到一个或多个多重定义符号(文件路径已修整)
错误 2 错误 LNK2005: "int __cdecl dice(int,int)" (?dice@@YAHHH@Z) 已在 Creature.obj 中定义(文件路径已修整)
文件路径:c:\Users\Username\documents\visual studio2010\Projects\RPGTest\RPGTest\RPGTest。(错误 3 引用了 .exe 文件,错误 2 引用了 .obj 文件)。
代码本身:
骰子.h
#ifndef SET_DICE_H_
#define SET_DICE_H_
#include <iomanip>
#include <iostream>
#include <stdlib.h>
using namespace std;
int dice(int number, int sides)
int total=0, dice;
srand(time(NULL));
int results=0;
do
dice = rand()%sides+1;
total+=dice;
number--;
while (number > 0);
results = total;
return results;
#endif
生物.h
#ifndef CREATURE_H_
#define CREATURE_H_
#include <iomanip>
#include <iostream>
#include "Dice.h"
using namespace std;
class Creature
public:
Creature(int,int,int,int,int,int,int,int,int,int,int,int);
void set_hp();
void set_saves();
void set_ac();
void set_bab();
void set_name();
void update_hp(int);
void update_ac(int);
void update_fsave(int);
void update_rsave(int);
void update_wsave(int);
int get_ac();
int get_hp();
int get_fsave();
int get_rsave();
int get_wsave();
int get_bonus(int);
int get_bab();
string get_name();
private:
int strength, dexterity, constitution, intellegence, wisdom, charisma;
int bab, fbsave, rbsave, wbsave;
int hdnum, hdsize;
int hp, fsave, rsave, wsave, ac;
string name;
;
#endif
生物.cpp
#include "Creature.h"
#include <math.h>
#include <iostream>
using namespace std;
Creature::Creature(int strength,int dexterity,int constitution,
int intellegence,int wisdom,int charisma,int bab,int fbsave,
int rbsave,int wbsave,int hdnum,int hdsize)
strength = strength;
dexterity = dexterity;
constitution = constitution;
intellegence = intellegence;
wisdom = wisdom;
charisma = charisma;
bab = bab;
fbsave = fbsave;
rbsave = rbsave;
wbsave = wbsave;
hdnum = hdnum;
hdsize = hdsize;
int Creature::get_bonus(int stat)
int bonus = floor((double(stat)-10)/2);
return bonus;
void Creature::set_ac()
ac=10+get_bonus(dexterity);
void Creature::set_hp()
hp = dice(hdnum,hdsize) + get_bonus(constitution)*hdnum;
void Creature::set_saves()
fsave = fbsave + get_bonus(constitution);
rsave = rbsave + get_bonus(dexterity);
wsave = wbsave + get_bonus(wisdom);
void Creature::set_bab()
bab = hdnum;
void Creature::set_name()
cout << "Please enter a name for this creature: ";
cout << "\nSorry! I don't work yet!";
cout << "\nInstead all creatures are named Larry!\n";
name = "Larry!";
void Creature::update_hp(int input)
hp = hp + input;
void Creature::update_fsave(int input)
fsave = fsave+input;
void Creature::update_rsave(int input)
rsave = rsave+input;
void Creature::update_wsave(int input)
wsave = wsave+input;
void Creature::update_ac(int input)
ac = ac+input;
int Creature::get_ac()
return ac;
int Creature::get_hp()
return hp;
int Creature::get_fsave()
return fsave;
int Creature::get_rsave()
return rsave;
int Creature::get_wsave()
return wsave;
int Creature::get_bab()
return bab;
RPGTest.cpp
#include "Creature.h"
#include <math.h>
//#include "Dice.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
int str = dice(3,6), dex = dice(3,6), con = dice(3,6), intel = dice(3,6), wis = dice(3,6), cha = dice(3,6);
int fbs = dice(1,6), rbs = dice(1,6), wbs = dice(1,6);
int hdn = dice(1,10), hds = 8, bab = dice(1,8);
cout << "Welcome to RPG Creature Tester v0.1\n";
cout << "This .exe file is meant to test the creature class functions and definitions.\n";
cout << "This will be done by randomly generating and displaying a creature.\n";
cout << "What you don't see right now is the random generation of a creature.\n";
cout << "Once it's finished, the \'statsheet\' will be shown.\n";
cout << "Cheers!\n\n";
Creature potato (str, dex, con, intel, wis, cha, bab, fbs, rbs, wbs, hdn, hds);
potato.set_ac();
potato.set_hp();
potato.set_name();
potato.set_saves();
cout << "OUTPUT BRICK YAY\n";
cout << "Str: " << str << endl;
cout << "HP: " << potato.get_hp() << " AC: " << potato.get_ac() << " Fort/Reflex/Will Save: " << potato.get_fsave() << "/" << potato.get_rsave() << "/" << potato.get_wsave();
return 0;
由于我主要是自学成才,我很高兴收到任何其他建议,但我的主要问题是我不确定为什么会出现“多重”定义错误。我对其他带有类似错误消息的问题进行了一些研究,但我没有看到任何立即跳出来作为“答案”的东西。
谢谢大家!
【问题讨论】:
【参考方案1】:C++ 的工作原理是编译单个翻译单元,然后将它们链接在一起。
这意味着每个源文件都会被自己编译。由于#include
指令基本上插入了所有包含的代码,因此在您的情况下,您最终会拥有多个定义的翻译单元
int dice(int number, int sides)
...
编译正常,但在链接时,发现此函数的多个定义,因此会产生错误。
解决这个问题有两种方法:
在头文件中声明int dice(int, int)
,但在源文件中定义(实现)
保持定义不变,但在其前面加上static
。这告诉编译器每个翻译单元都会有自己的dice
方法。这种解决方案虽然很诱人,但会导致二进制文件大小增加,因为您将有多个实现相同的方法
【讨论】:
静态的? “内联”不是一个(更好的)解决方案吗?老实说,我什至不知道 static 对函数有效。以上是关于C++ 中的多个定义 (Visual Basic 2010)的主要内容,如果未能解决你的问题,请参考以下文章
为啥某些 Microsoft 语言被称为“视觉”? (Visual C#、Visual Basic .NET、Visual C++)
MS Visual Studio 2012 Express 是不是同时包含 C#、Visual Basic、C++? [关闭]
visual c++中如何用CreateWindow函数创建状态栏