【发布时间】:2013-07-06 09:25:54
【问题描述】:
我有一个抽象类,IPacket。
/*
* Represents an abstract network packet.
*/
class IPacket
{
public:
virtual void read(...) = 0;
virtual void write(...) = 0;
virtual int getID() const = 0;
};
我想(并且一直)返回一个指向这样的指针:
class PacketMedium
{
/*!
* Returns a pointer to the next pending packet or NULL if there are no packets pending.
* \note The object must deleted when you are finished with it.
*/
IPacket* receivePacket();
};
现在显然,这是不好的做法;要求调用者删除一个甚至不是自己分配的指针。我相信的约定是使用智能指针,即
class PacketMedium
{
public:
std::unique_ptr<IPacket*> receivePacket();
};
但由于这是库代码,智能指针是一个 nono,尽管事实上我宁愿避免它们。
我最好的选择是什么?
感谢您的帮助:)
编辑:之前有人问过这个问题并给出了很好的答案,尽管它们都建议使用智能指针,或者只是不在堆上分配。鉴于IPacket 是抽象的,堆栈分配将不起作用。
【问题讨论】:
-
我不明白;要么你想确保调用者
deletes 是对象,要么你可以使用智能指针为你管理它,但你似乎也不想要。那你想要什么? -
也许他想在没有任何类型指针的情况下返回对象。如今,编译器擅长复制省略。
-
我相信我必须使用动态分配
IPacket,因为派生类有不同的大小,所以在堆栈中使用IPacket的派生类是不可能的。智能指针似乎是我唯一的选择。我正在寻找某种方法来重组我的代码,以便我可以创建 IPacket 对象并以一种明显的方式删除它们。 -
Apart from the fact that many libraries were written before the advent of standard smart pointers, the biggest reason is probably the lack of a standard C++ ABI.stackoverflow.com/questions/10334511/… -
@Dylan 这是一个糟糕的理由。好的库在其接口中使用 C++ 类型,不这样做的库不是一个很好的库。并且缺乏标准化的二进制接口并没有你想象的那么严重,因为你只需要为不同的架构重新编译库,对于 C 和 C++ 来说,这无论如何都是很常见的。摘要:做使用智能指针,这是正确的解决方案。