实现工厂模式

时间:2017-10-27 13:42:56

标签: c++ inheritance virtual-functions

我的SW中有一组可能的连接,所以我决定使用工厂模式,所以我创建了基类(.h和.cpp)

以下Connection.h头文件的内容

namespace Connection
{
    class Connection
    {
        public: 
             Connection();
             ~Connection();

             virtual void sendPacket(Packet* p) = 0;
             virtual void receivePacket() = 0;
             virtual int connect() = 0;
             virtual void disconnect() = 0; 
     }
}

甚至存在Connection.cpp文件,但它只有一个空的构造函数和解构函数。

接下来,我创建了派生类(.h和.cpp文件)

namespace Connection
{
    class SocketConnection : public Connection
    {
        public:
            SocketConnection();
            ~SocketConnection();
    }
}

及其相关的SocketConnection.cpp文件,我正在尝试定义Connection.h中定义的纯虚方法

namespace Connection
{
    SocketConnection::SocketConnection() { }
    SocketConnection::~SocketConnection() { }

    int connect()
    {
        //Design of socket connection
    }
}

接下来,我创建了一个新的Connection, DatabaseConnection 以与SocketConnection()相同的方式进行了实际定义。

我得到的错误是

  

Connection :: connect();

的多重定义

在调用Cross G++ Linker但我找不到原因时。谁能告诉我哪里错了?谢谢!

2 个答案:

答案 0 :(得分:3)

如果要在SocketConnection中覆盖connect,则必须在类定义中声明它:

namespace Connection
{
    class SocketConnection : public Connection
    {
        public:
            SocketConnection();
            ~SocketConnection();
             virtual int connect(); // virtual is not required here but it doesn't hurt
    }
}

然后必须正确定义范围:

namespace Connection
{
    SocketConnection::SocketConnection() { }
    SocketConnection::~SocketConnection() { }

    int SocketConnection::connect()
    {
        //Design of socket connection
    }
}

答案 1 :(得分:0)

SocketConnection.h内,您应该添加:

virtual int connect();

SocketConnection.cpp内,你应该定义一个范围SocketConnection::connect()而不是connect(),如下所示:

int SocketConnection::connect()
{
    //Design of socket connection
}

所有其他连接类型都相同。