visual studio -已经定义了c++类

visual studio - already defined class C++

本文关键字:c++ 定义 studio visual      更新时间:2023-10-16

我一点也不明白。我有一个名为"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.omain.o中都是重复的

你应该在network.h

中指定
extern networkClass network;

然后在network.cpp中实例化它(作为一个全局变量,如果这是你的意图)。