0

Baseコンストラクターが引数として参照を取るbase class( ) があります。派生クラスのコンストラクターで、スーパークラス コンストラクターを呼び出します。もちろん、参照を引数として渡す必要があります。しかし、戻り値の型が値であるメソッドからその引数を取得する必要があります...

簡単な例を挙げます:

class Base
{
public:
    Base(MyType &obj) { /* do something with the obj */}
};

class Derived : public Base
{
public:
    Derived(MyOtherType *otherType) :
         Base(otherType->getMyTypeObj()) // <--- Here is the error because (see *)
    {
         // * 
         // getMyTypeObj() returns a value and
         // the Base constructor wants a reference...
    }
};

class MyOtherType
{
public:
    MyType getMyTypeObj()
    {
         MyType obj;
         obj.setData( /* blah, blah, blah... Some data */);
         return obj; // Return by value to avoid the returned reference goes out of scope.
    }
};

どうすればこの問題を解決できますか?

4

4 に答える 4

3

基本クラスを次のように変更します。 class Base { public: Base(const MyType &obj) { /* do something with the obj */} };

更新: obj を変更したい場合、明らかにconst参照を持つことはできません。その場合、次のいずれかを実行できます。

1) パラメータを値で渡します。これにはコピーのオーバーヘッドがありますが、後で明示的に解放する必要はありません。

2)MyOtherType::getMyTypeObj()に変更

MyType& MyOtherType::getMyTypeObj()
{
    MyType* obj = new MyType();
    obj->setData( /* blah, blah, blah... Some data */);
    return *obj;

}

この場合、操作が完了したらオブジェクトを削除することを忘れないでください。

于 2010-07-07T16:11:17.143 に答える
1

真剣に?あなたの質問には答えがあります。パラメータの型を Base コンストラクターに変更するか、getMyTypeObj() の戻り値の型を変更して、型に互換性を持たせます。

于 2010-07-07T16:39:42.827 に答える
0

これを解決するには2つの方法があるように私には思えます。

  1. Base コンストラクターを変更して、参照ではなく値で MyType オブジェクトを受け入れるようにします。これにより、一時オブジェクトがコピーされ、スコープの問題が解決されます。

  2. または、Derived で MyType オブジェクトのコピーを作成し、その参照を渡すこともできます。

class Derived : public Base
{
public:
    Derived(MyOtherType *otherType) :
        Base(m_myType) ,
        m_myType(otherType->getMyTypeObj())
    {
        // ...
    }
private:
    MyType m_myType;
};

オプション 1 はよりシンプルであり、一般的にお勧めします。
オプション 2 は、他の制約によって Base コンストラクターを変更できない場合に備えて、

于 2010-07-07T16:44:30.200 に答える
0

この問題は、スタックベースの「obj」のコピーを返す GetMyTypeObj() によって引き起こされるため、コンパイラはコンストラクター内に一時変数を作成し、そのスコープはその Base() 構築呼び出しだけです。

于 2010-07-07T16:06:48.730 に答える