Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接器错误:需要C++;虚拟基类析构函数_C++_Gcc_Abstract Class_Linker Errors - Fatal编程技术网

C++ 链接器错误:需要C++;虚拟基类析构函数

C++ 链接器错误:需要C++;虚拟基类析构函数,c++,gcc,abstract-class,linker-errors,C++,Gcc,Abstract Class,Linker Errors,我有一个链接错误,链接器抱怨我的具体类的析构函数正在调用它的抽象超类析构函数,代码缺失 这是从XCode在MacOSX上使用GCC4.2 我看到了,但不完全一样 以下是链接器错误消息: Undefined symbols: "ConnectionPool::~ConnectionPool()", referenced from: AlwaysConnectedConnectionZPool::~AlwaysConnectedConnectionZPool()in RKConnec

我有一个链接错误,链接器抱怨我的具体类的析构函数正在调用它的抽象超类析构函数,代码缺失

这是从XCode在MacOSX上使用GCC4.2

我看到了,但不完全一样

以下是链接器错误消息:

Undefined symbols:
  "ConnectionPool::~ConnectionPool()", referenced from:
      AlwaysConnectedConnectionZPool::~AlwaysConnectedConnectionZPool()in RKConnector.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
以下是抽象基类声明:

class ConnectionPool {
public:
    static ConnectionPool* newPool(std::string h, short p, std::string u, std::string pw, std::string b);   
    virtual ~ConnectionPool() =0;
    virtual int keepAlive() =0;
    virtual int disconnect() =0;
    virtual sql::Connection * getConnection(char *compression_scheme = NULL) =0;
    virtual void releaseConnection(sql::Connection * theConnection) =0;
};
class AlwaysConnectedConnectionZPool: public ConnectionPool {
protected:
    <snip data members>
public:
    AlwaysConnectedConnectionZPool(std::string h, short p, std::string u, std::string pw, std::string b);   
    virtual ~AlwaysConnectedConnectionZPool();
    virtual int keepAlive();    // will make sure the connection doesn't time out. Call regularly
    virtual int disconnect();   // disconnects/destroys all connections.
    virtual sql::Connection * getConnection(char *compression_scheme = NULL);
    virtual void releaseConnection(sql::Connection * theConnection);
};
下面是具体的类声明:

class ConnectionPool {
public:
    static ConnectionPool* newPool(std::string h, short p, std::string u, std::string pw, std::string b);   
    virtual ~ConnectionPool() =0;
    virtual int keepAlive() =0;
    virtual int disconnect() =0;
    virtual sql::Connection * getConnection(char *compression_scheme = NULL) =0;
    virtual void releaseConnection(sql::Connection * theConnection) =0;
};
class AlwaysConnectedConnectionZPool: public ConnectionPool {
protected:
    <snip data members>
public:
    AlwaysConnectedConnectionZPool(std::string h, short p, std::string u, std::string pw, std::string b);   
    virtual ~AlwaysConnectedConnectionZPool();
    virtual int keepAlive();    // will make sure the connection doesn't time out. Call regularly
    virtual int disconnect();   // disconnects/destroys all connections.
    virtual sql::Connection * getConnection(char *compression_scheme = NULL);
    virtual void releaseConnection(sql::Connection * theConnection);
};
也可能是工厂常规:

ConnectionPool* ConnectionPool::newPool(std::string h, short p, std::string u, std::string pw, std::string b)
{
    return new AlwaysConnectedConnectionZPool(h, p, u, pw, b);
}
我可以通过人为地使抽象基类具体化来解决这个问题。但我宁愿做得更好。有什么想法吗


谢谢

即使将析构函数声明为纯虚拟函数,也必须为其提供实现。虽然不能直接实例化抽象类,但在实例化其派生(具体)类时,它总是被实例化。因此,在某个时刻,这些实例将被销毁,因此需要一个析构函数。纯虚拟析构函数的实现可以(通常是)为空函数:

ConnectionPool::~ConnectionPool() {
}

即使在抽象类中,也不希望析构函数是纯虚拟的。这是因为当一个具体的子类的析构函数被调用时,它将被调用

我们使用以下模式

福安

foo.cpp

AbstractBaseClass::~AbstractBaseClass() {
}

参见.< /p>您的回答意味着,但是值得强调的是C++中的抽象方法可以实现。当我发现之前,我一直认为方法要么是抽象的,要么是有实现的,而不是两者都有。@sbk这是错误的。在C++中,抽象意味着纯虚拟。非纯虚函数不是抽象的,也不会使其类抽象。@Zimano:我的评论哪部分是不正确的?我同意“纯虚拟”和“抽象”是一回事。我是说C++中的抽象/纯虚方法可以有体/实现和析构函数,甚至抽象,必须有一个。也就是说,代码段

类A{virtual~A()=0{}
是valid@sbk当我尝试纯虚方法的定义必须出格时,我得到了“函数定义上的纯说明符”,即
类a{virtual~a()=0;};答::~A(){}
如果希望它是纯虚拟的,只需要提供一个实现。另外,您发布的链接没有针对纯虚拟析构函数。@MPG:有时您可能想声明一个抽象基类(无法实例化的基类),但您发现自己没有虚拟函数-您可以始终声明析构函数为纯虚拟的-然后正如Neil所说,它必须有一个实现(我也不确定我是否意识到了)。@Neil:如果抽象基类有其他纯虚拟方法,那么dtor也没有什么特别的理由是纯的(据我所知)。正如您所提到的,它需要有一个实现。考虑到这两个前提,没有理由让dtor成为一个纯虚拟方法-我想质疑一个类的基本原理,其中唯一的纯虚拟方法是dtor。@Michael同意。尽管有些人可能会说,如果您的类是抽象的,它应该总是有一个PVD-th如果您可以添加或删除其他PVF,而不会使类成为非抽象类。但是ConnectionPool::~ConnectionPool是在CPP文件中定义的吗?即使您将其声明为纯虚拟的,您也需要一个定义。析构函数很奇怪。该定义应该为空,并且我认为您不希望将其内联到H文件中。