已经定义 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.omain.o

中都是重复的

你应该做的是在network.h

中指定
extern networkClass network;

然后在 network.cpp 中将其实例化(如果这是您的意图,则作为全局变量)。