3

extern 参照を更新する基本クラスがあり、この参照をメンバーとして埋め込む継承クラスを作成したいと考えています。参照の一種のデフォルト初期化。

私は次の解決策を思いつきました:

#include<iostream>

class Statefull
{
public:
    Statefull( int& ref ) : _base_ref(ref) {}
    int& _base_ref;
    // update the extern variable
    void work() { std::cout << ++_base_ref << std::endl; }
};

class Stateless : public Statefull
{
public:
    // use a temporary allocation
    Stateless( int* p = new int() ) :
        // we cannot initialize local members before base class:
        // _dummy(), Statefull(_dummy)
        // thus, initialize the base class on a ref to the temporary variable
        Statefull(*p),
        _tmp(p),
        _dummy()
    {
        // redirect the ref toward the local member
        this->_base_ref = _dummy;
    }
    int* _tmp;
    int _dummy;
    // do not forget to delete the temporary
    ~Stateless() { delete _tmp; }
};

int main()
{
    int i = 0;
    Statefull full(i);
    full.work();

    Stateless less;
    less.work();
}

しかし、コンストラクターのデフォルトの引数で一時的な割り当てが必要になるのはかなり見苦しいです。基本クラスのコンストラクターで参照を保持しながら、この種のデフォルトの初期化を実現するより洗練された方法はありますか?

4

3 に答える 3

4

クラスStatelessは 3 のルールに違反しています。しかし、これは実際の問題を示すサンプル コードにすぎないためだと思います。

ここで、実際に問題に対処します。初期化が実際に行われる前にその値が使用されない限り、初期化されていない変数への参照をバインドすることは完全に有効です。

Stateless() : Statefull(_dummy), _dummy() {}

現在の解決策は機能しますが、なぜ機能するのかについて誤解があるようです。

    // redirect the ref toward the local member
    this->_base_ref = _dummy;

参照を「リダイレクト」することはできません。参照をバインドできるのは、初期化時のみです。参照に割り当てると、それが参照するオブジェクトに割り当てられます。この場合、this->_base_ref = _dummy は とまったく同じ です: の値をに*_tmp = _dummy代入します。、ただし、まだ参照しています (これは でテストできます)。_dummy*_tmp_base_ref*_tmpassert(&_base_ref == tmp)

于 2012-07-18T08:40:04.207 に答える
1

私はこれがうまくいくかもしれないと思います:

StateLess(): Statefull(*new int) {}
~StateLess() { delete &_base_ref; }

一時的なものなしで行うことはできませんが、それらはクラス定義に含まれている必要はありません。

于 2012-07-18T08:46:17.270 に答える
0

さらにいくつかのクラスを使用してすべてを解決できます

class StateForStateful
{
protected:
    int state;
};

class Stateless: private StateForStateful, public Stateful // order is important
{
public:
     Stateless():Stateful(this->state) {}
};
于 2012-07-18T10:16:23.820 に答える