Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++_Qt_Constructor_Smart Pointers - Fatal编程技术网

C++ 智能指针构造函数错误

C++ 智能指针构造函数错误,c++,qt,constructor,smart-pointers,C++,Qt,Constructor,Smart Pointers,我试图理解智能指针的用法。在下面的例子中,我打算 类B是指向类A的智能指针。我得到以下链接器错误 error LNK2019: unresolved external symbol "public: __thiscall ClassB::ClassB(classA *)" 我似乎在构造函数中遗漏了一些东西。我不清楚应该从构造函数中的类A传递什么。如果有人能解释一下,我将不胜感激 class A { friend class B; virtual methods

我试图理解智能指针的用法。在下面的例子中,我打算 类B是指向类A的智能指针。我得到以下链接器错误

error LNK2019: unresolved external symbol "public: __thiscall ClassB::ClassB(classA *)"
我似乎在构造函数中遗漏了一些东西。我不清楚应该从构造函数中的类A传递什么。如果有人能解释一下,我将不胜感激

 class A 
    {

     friend  class B;
    virtual methods ();

    protected:
    virtual ~A();

    }

    class B:public QSharedPointer<A>
    {
       B();
       B(A * pData);
       B(const  B &data);
      virtual ~  B();

    }
A类
{
B级朋友;
虚拟方法();
受保护的:
虚拟~A();
}
B类:公共QSharedPointer
{
B();
B(A*pData);
B(施工和数据);
虚拟~B();
}

您得到的错误是链接器错误,而不是编译器错误,当您对函数进行原型化但未实现它时,会发生这种错误(在其他情况中)。您是否为
B::B(A*)
构造函数提供了实现?如果是,您是否编译并将其链接到生成的可执行文件?如果不是,这将解释两个问题的答案都是“否”,那么您应该可以通过在实现中提供和链接来轻松解决这个问题。

如果您只是尝试使用智能指针,那么不应该尝试从您想要的QSharedPointer继承

QSharedPointer<A> ptr(new A());
ptr->do_something();
QSharedPointer ptr(新的A());
ptr->do_something();

如果您正试图实现自己的智能指针,那么您很可能不想从其他智能指针类继承。您可以查看scoped_指针的boost实现,以获得一个相当容易理解的基本智能指针实现。

这是实际的代码和链接器错误吗?您的类名为
B
,但链接器错误引用了
ClassB
,这似乎很奇怪。语法错误,是否要修改?“;”小姐,缺少大多数mem函数的定义。类A是一个抽象类,许多客户端调用当前返回*的函数。我想使用智能指针,这样客户端就不必执行删除操作。出于这个目的,从QSharedpointer继承不是一种正确的方法吗?@VIJ:为什么要继承它,而不是说,
typedef QSharedpointer B?我想说这绝对不是一条路要走。正如aschepler指出的那样,typedef做了您想要的事情。通常,如果您希望以某种方式更改基类的行为,而我认为在本例中您不希望以这种方式更改基类的行为,那么您会希望继承。顺便说一句,不必调用delete实际上是使用智能指针的一个很小的好处。首先也是最重要的智能指针是一种将delete调用放入析构函数的通用方法。这是确保程序在引发异常时不会泄漏资源的唯一方法。根据经验,无论何时,只要您看到一个delete调用,而该调用不在析构函数中,就会出现内存泄漏,因为在new和delete之间几乎总是会有一些可以忽略的东西throw@ltc谢谢你的评论。据我所知,QSharedpointer已经提供了删除的功能。因此typedef QSharedPointer B应该有助于避免内存泄漏。您提到了在析构函数中放置delete调用。当使用来自用户代码的QSharedPointer时,不会显式执行此操作。QSharedpointer如何实现这一点?