0

我有一个基类(Base),它的构造函数将引用作为参数。在我的派生类它的构造函数中,我调用超类构造函数,当然我需要传递一个引用作为参数。但是我必须从返回类型为按值的方法中获取该参数...

我将举一个简短的例子:

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

问题是由 GetMyTypeObj() 返回一个基于堆栈的 'obj' 的副本引起的,因此编译器在您的构造函数中创建了一个临时变量,其范围就是那个 Base() 构造调用。

于 2010-07-07T16:06:48.730 回答
0

在我看来,有两种方法可以解决这个问题。

  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;
};

Option 1 is simpler and I would generally recommend it.
Option 2 is just in case some other constraint prevents you changing the Base constructor,

于 2010-07-07T16:44:30.200 回答