3

コピーできないクラスがFooあり、そのコンストラクターの1つがたまたまへの参照を受け取ったとしFooます。

class Foo
{
public:
    Foo(Foo& parent) {...}

private:
    void operator=(Foo); // disabled
    ...
};

コンパイラーは、これがコピーコンストラクターであると見なしますが、コピーとはまったく関係のないことを行います(したがって、代入演算子は無効になります)。

この方法でコンストラクターを定義することに危険はありますか、またはその署名を人為的に変更する必要がありますか?たとえば、参照の代わりにポインターを使用するか、必須のダミーパラメーターを追加しますか?

ここにいくつかのコンテキストがあります(おそらく私の質問を理解/回答する必要はありません)。

自分で作成したクラスライブラリがあります。これは、ユーザーコードと別のライブラリ間の接続として機能します。もう1つのライブラリは、簡潔にするためにfrobnicateと呼ぶサービスを提供します。ユーザーコードは次のようになります。

class UsefulObject: public mylib::Frobnicator
{
    ...
    void DoStuff()
    {
        int x = ...
        ...
        frobnicate(x); // it's important to allow simple syntax here
        frobnicate(x + 1);
        ...
    }
    ...
};

ユーザーオブジェクトの階層をサポートしたいと思います。各オブジェクトは別の(その親)に含まれていますが、他のすべてのオブジェクトを含むいくつか(私の場合は5)のトップレベルオブジェクトがあります。

各オブジェクトにはログファイルがあります。各呼び出しを複数のログファイルに記録し、最上位オブジェクトまで包含階層を上に配置したいと思います。

私はそれをこのように実装しました:

namespace mylib
{
    class Frobnicator // provides the frobnication service
    {
    public:
        Frobnicator(Frobnicator& parent): parent(parent) {}
    protected:
        virtual void frobnicate(int x) {
            ... // some logging code
            parent->frobnicate(x);
        }
    private:
        Frobnicator& parent;
    };

    namespace internal // users of mylib, please don't use this!
    {
        class TheUltimateFrobnicator: public Frobnicator
        {
        protected:
            virtual void frobnicate(int x) {
                the_other_library::frobnicate(x);
            }
        private:
            TheUltimateFrobnicator(int id); // called by a factory or some such
        };
    }
}
4

1 に答える 1

7

これは、そのようなコンストラクターの意味における不幸なあいまいさのようです。これを明確にする最も簡単な方法は、ポインターを使用することだと思います

class Frobnicator // provides the frobnication service
{
public:
    explicit Frobnicator(Frobnicator *parent): parent(parent) {}
protected:
    virtual void frobnicate(int x) {
        ... // some logging code
        parent->frobnicate(x);
    }
private:
    void operator=(Foo); // disabled
    Frobnicator(Frobnicator const&); // disabled

    Frobnicator *parent;
};

とにかくパラメータがポインタになることを期待する人はたくさんいます。ちなみに、あなた自身は。とタイプミスparent.frobnicateしましparent->frobnicateた。

于 2011-01-23T14:23:03.353 に答える