0

抽象クラス 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();
};

しかし、これはライブラリ コードであるため、スマート ポインターは非現実的ですが、私はそれらを回避したいと考えています。

私の最良の選択肢は何ですか?

助けてくれてありがとう:)

編集:これは以前に尋ねられ、非常に良い答えが与えられましたが、それらはすべてスマートポインターを示唆しているか、ヒープに割り当てていないだけです。それが抽象的であることを考えるとIPacket、スタック割り当ては機能しません。

4

3 に答える 3

0

参照を返す必要さえありません。public/relevantIPacketインターフェイスをクラスの背後にラップすることもできます。このクラスは、高度な操作も行い、受信パケットが消費されると削除を処理します (つまり、型の呼び出しreceivePacket())。

バイナリ互換性が主な関心事である場合は、独自の単純な unique_ptr を記述できます。

于 2013-07-06T10:06:35.360 に答える