5

Derived クラスのメンバー変数を初期化し、それを Base クラスのコンストラクターに渡したいと考えています。以下の解決策を思いつきました(ここでも:http://cpp.sh/4uu4q

1) 次のコードには、定義済みまたは未定義の動作 (UB) がありますか?

2) 私がやろうとしていることは、設計が悪いことを示していますか?

struct Data {
    int fValue;

    Data( int value = -1 ) : fValue( value )
    {}
};


struct Base {
    Base( const std::unique_ptr<Data> & derivedData ) {
        std::cout << "Constructing Base derivedData=" << derivedData->fValue << std::endl;
    }
};


struct Derived : public Base {
    std::unique_ptr<Data> fData = std::move( fData );

    Derived() : Base( ConstructData() )
    {}

    const std::unique_ptr<Data> & ConstructData() {
        fData.release();
        fData.reset( new Data(777) );
        std::cout << "in ConstructData: fData->fValue =" << fData->fValue << std::endl;
        return fData;
    }
};


int main() {
    Derived d;
    std::cout << "In main: d.fData->fValue =" << d.fData->fValue << std::endl;
    return 0;
}
4

1 に答える 1