我目前正在玩C ++,并尝试重建我用C ++制作的Tic Tac Toe批处理控制台游戏,但是已经碰壁,我无法弄清楚如何摆脱错误TicTacToe.obj : error LNK2005: "class computer comp" (?comp@@3Vcomputer@@A) already defined in computer.obj
。我试过从标题中删除函数计算机的声明,以及C ++中函数的定义,但是没有修复错误。我弄清楚如何删除此错误的唯一方法是删除对象名称,我有点不想这样做。我使用网站http://www.cplusplus.com/doc/tutorial/classes/上给出的示例来设置类计算机。您可以提供有关我目前所遇到的任何错误或我可能不需要的任何功能的任何信息,我最希望了解C ++。
CODE:
TicTacToe.cpp
// TicTacToe.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include "computer.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
comp.Select();
Sleep(1000);
}
computer.cpp
#include "stdafx.h"
#include "computer.h"
#include <iostream>
using namespace std;
computer::computer()
{
}
computer::~computer()
{
}
void computer::Select()
{
}
computer.h
#pragma once
class computer
{
public:
computer();
~computer();
void Select(void);
} comp;
额外信息:
我在运行Windows 7的笔记本电脑上使用Microsoft Visual Studio Professional 2013.
答案 0 :(得分:1)
当您在模块"computer.h"
和computer.cpp
中包含标头TicTacToe.cpp
时,这两个模块包含对象comp
的相同定义
pragma once
class computer
{
public:
computer();
~computer();
void Select(void);
} comp;
因此链接器会发出错误。
仅在一个cpp模块中定义对象。标题应仅包含类定义。
例如
computer.h
#pragma once
class computer
{
public:
computer();
~computer();
void Select(void);
};
TicTacToe.cpp
// TicTacToe.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include "computer.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
computer comp;
comp.Select();
Sleep(1000);
}
答案 1 :(得分:0)
您必须从头文件中删除comp。在cpp文件中创建对象,如下所示:
computer comp;
你说你不想这样做。如果这会给您带来一些其他问题,请发布有关该问题的新问题。
答案 2 :(得分:0)
您正在标题中定义comp
,因此在包含该标题的每个.cpp中都是如此,因此您违反了单一定义规则。
相反,你可以在标题中声明它:
extern computer comp;
然后在一个.cpp中定义它:
computer comp;
仍允许您从任何包含标题的.cpp访问它。