已经定义 class C++
already defined class C++
我不明白一个想法。我有一个名为 "network.h" 的头文件,其中包含带有函数的 class 的声明。在 "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
Headers 意味着包含在多个编译单元(cpp 文件)中。不幸的是,您在 network.h
中定义了全局 object network
。因此它将被声明多次(一次是在编译 network.cpp 时,另一次是在编译 main.cpp 时)。
全局变量(如果不能通过其他方式避免)应仅作为外部变量出现在 headers 中:
extern networkClass network; // you say this variable exist somewhere else
然后您必须将定义放入您的一个 cpp 文件中。顺便说一下,如果你的 class 不是绝对需要它,你不应该在 class header 中定义它。在 main.cpp 中定义它。如果你能完全避免使用全局变量,那就摆脱它。
您在 network.cpp
中遇到的另一个问题是您的语法定义了全局 class 独立的全局函数。每当您在 class 之外定义 class 函数时,您必须在其名称前加上 class 名称。例如:
void networkClass::bind() // say which class the function is a member
...
您很可能完成了两次单独的编译。 network.cpp
的编译,可能还有 main()
函数在哪里的编译。
在`network.h"中声明变量
networkClass network;
因此,如果您在 main()
函数所在的源代码中包含 header network.h
,则编译器会将变量网络作为实例读取。
但是,在链接过程中,检测到变量网络在network.o
和main.o
中都是重复的
你应该做的是在network.h
中指定
extern networkClass network;
然后在 network.cpp
中将其实例化(如果这是您的意图,则作为全局变量)。
我不明白一个想法。我有一个名为 "network.h" 的头文件,其中包含带有函数的 class 的声明。在 "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
Headers 意味着包含在多个编译单元(cpp 文件)中。不幸的是,您在 network.h
中定义了全局 object network
。因此它将被声明多次(一次是在编译 network.cpp 时,另一次是在编译 main.cpp 时)。
全局变量(如果不能通过其他方式避免)应仅作为外部变量出现在 headers 中:
extern networkClass network; // you say this variable exist somewhere else
然后您必须将定义放入您的一个 cpp 文件中。顺便说一下,如果你的 class 不是绝对需要它,你不应该在 class header 中定义它。在 main.cpp 中定义它。如果你能完全避免使用全局变量,那就摆脱它。
您在 network.cpp
中遇到的另一个问题是您的语法定义了全局 class 独立的全局函数。每当您在 class 之外定义 class 函数时,您必须在其名称前加上 class 名称。例如:
void networkClass::bind() // say which class the function is a member
...
您很可能完成了两次单独的编译。 network.cpp
的编译,可能还有 main()
函数在哪里的编译。
在`network.h"中声明变量
networkClass network;
因此,如果您在 main()
函数所在的源代码中包含 header network.h
,则编译器会将变量网络作为实例读取。
但是,在链接过程中,检测到变量网络在network.o
和main.o
你应该做的是在network.h
extern networkClass network;
然后在 network.cpp
中将其实例化(如果这是您的意图,则作为全局变量)。