visual studio -已经定义了c++类
visual studio - already defined class C++
我一点也不明白。我有一个名为"network.h"的头文件,其中有函数类的声明。在"network.cpp"文件中,我有这些函数。当我想在main.cpp中包含"network.h"并编译我的项目(Microsoft Visual Studio 2007)时,我得到了这个消息:
network.obj : error LNK2005: "class networkClass network" (?network@@3VnetworkClass@@A) already defined in main.obj
我知道我们不能例如创建两个相同的变量,但在这里我不知道哪里出了问题。
源:network.h
#ifndef H_NETWORK
#define H_NETWORK
#include <string>
#include <SFML/Network.hpp>
struct getClientsStruct
{
std::string nick;
sf::IpAddress clientIp;
};
getClientsStruct receiveClientIfno();
class networkClass
{
public:
void sendMyInfo();
void bind();
getClientsStruct receiveClientIfno();
};
networkClass network;
#endif
network.cpp
#include <SFML/Network.hpp>
#include "network.h"
#include <iostream>
#include <string>
sf::UdpSocket searchSocket;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
void sendMyInfo()
{
sf::UdpSocket searchSocket;
std::string myLocalAddress = sf::IpAddress::getLocalAddress().toString();
char dataSend[100] = "DANE.......";
sf::IpAddress recipient = "255.255.255.255";
unsigned short portSending = 54000;
if (searchSocket.send(dataSend, 100, recipient, portSending) != sf::Socket::Done)
{
// error...
std::cout << "Sending ERROR" << std::endl;
}
else
std::cout << "Sending SUCCESSED" << std::endl;
}
void bind()
{
// bind the socket to a port
if (searchSocket.bind(54000) != sf::Socket::Done)
{
std::cout << "ERROR binding" << std::endl;
}
else
std::cout << "BIND success" << std::endl;
}
getClientsStruct receiveClientIfno()
{
getClientsStruct ClientInfo;
searchSocket.setBlocking(0);
char dataReceived[100];
std::size_t received;
sf::IpAddress sender;
unsigned short portReceive;
if (searchSocket.receive(dataReceived, 100, received, sender, portReceive) != sf::Socket::Done)
{ // error...
std::cout << "Receive ERROR" << std::endl;
}
std::cout << "Received " << received << " bytes from " << sender << " on port " << portReceive << std::endl;
return ClientInfo;
}
---------------------------------- 编辑 -------------------------------------
所以,我从network.h中删除了networkClass network;
,并在main.cpp中声明它。现在,当我想运行函数,例如network.bind();
,我得到错误:main.obj : error LNK2019: unresolved external symbol "public: void __thiscall networkClass::bind(void)" (?bind@networkClass@@QAEXXZ) referenced in function _main
头文件应该包含在几个编译单元(cpp文件)中。不幸的是,在network.h
中,您定义了一个全局对象network
。因此,它将被声明几次(一次在编译network.cpp时,另一次在编译main.cpp时)。
全局变量(如果它们不能通过其他方式避免)应该只以extern:
的形式出现在头文件中。 extern networkClass network; // you say this variable exist somewhere else
然后,您必须将该定义放入一个cpp文件中。顺便说一下,如果您的类不是绝对需要它,则不应该在类头文件中定义它。在main.cpp中定义它。如果你可以避免全局变量,那就去掉它。
您在network.cpp
中遇到的另一个问题是,您的语法定义了全局类独立的全局函数。无论何时在类之外定义类函数,都必须在其名称前加上类名。例如:
void networkClass::bind() // say which class the function is a member
...
您很可能已经完成了两次单独的编译。network.cpp
的编译和main()
函数的编译。
在"network.h"中,声明变量
networkClass network;
因此,如果你在源代码中包含main()
函数的头文件network.h
,那么编译器将把网络变量作为实例来读取。
但是,在链接过程中,检测到变量网络在network.o
和main.o
中都是重复的
你应该在network.h
extern networkClass network;
然后在network.cpp
中实例化它(作为一个全局变量,如果这是你的意图)。
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类