我目前正在玩C++,并试图重建我在C++年制作的井字游戏批量控制台游戏,但遇到了困难,我不知道如何摆脱错误TicTacToe.obj : error LNK2005: "class computer comp" (?comp@@3Vcomputer@@A) already defined in computer.obj
。 我尝试从标头中删除函数计算机的声明,以及C++中函数的定义,但这并没有修复错误。 我想出如何删除此错误的唯一方法是删除对象名称,我有点不想这样做。 我使用网站上给出的示例 http://www.cplusplus.com/doc/tutorial/classes/来设置类计算机。 您可以提供有关我当前遇到的任何错误或我可能不需要的任何功能的任何信息,绝对欢迎,因为我想了解更多关于C++的信息。
法典:
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);
}
计算机.cpp
#include "stdafx.h"
#include "computer.h"
#include <iostream>
using namespace std;
computer::computer()
{
}
computer::~computer()
{
}
void computer::Select()
{
}
计算机.h
#pragma once
class computer
{
public:
computer();
~computer();
void Select(void);
} comp;
额外信息:
我在运行Windows 7的笔记本电脑上使用Microsoft Visual Studio Professional 2013。
由于您在两个模块computer.cpp
和TicTacToe.cpp
中都包含标头"computer.h"
,因此这两个模块包含相同的对象comp
定义
pragma once
class computer
{
public:
computer();
~computer();
void Select(void);
} comp;
因此,链接器发出错误。
仅在一个 cpp 模块中定义对象。标头应仅包含类定义。
例如
计算机.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);
}
您必须从头文件中删除 comp。在 cpp 文件中创建对象,如下所示:
computer comp;
你说你不想那样做。如果这给您带来了其他问题,请发布有关该问题的新问题。
您在标头中定义comp
,因此在包含该标头的每个.cpp中,因此您违反了一个定义规则。
相反,您可以在标头中声明它:
extern computer comp;
然后用一个.cpp来定义它:
computer comp;
这仍然允许您从包含标头的任何.cpp访问它。