相关疑难解决方法(0)

当它被绑定到调用函数中的const引用时,它的返回值的生命周期如何扩展到调用函数的范围?

"如果从函数返回一个值(不是引用),那么将它绑定到调用函数中的const引用,它的生命周期将扩展到调用函数的范围."

所以:案例A.

const BoundingBox Player::GetBoundingBox(void)
{
    return BoundingBox( &GetBoundingSphere() );
}
Run Code Online (Sandbox Code Playgroud)

const BoundingBox从函数返回类型的值GetBoundingBox()

变体I :(将它绑定到const引用)

const BoundingBox& l_Bbox = l_pPlayer->GetBoundingBox();
Run Code Online (Sandbox Code Playgroud)

变体II :(将它绑定到const副本)

const BoundingBox l_Bbox = l_pPlayer->GetBoundingBox();
Run Code Online (Sandbox Code Playgroud)

两者都工作正常,我没有看到l_Bbox对象超出范围.(虽然,我在变体1中理解,复制构造函数未被调用,因此稍微好于变体II).

另外,为了比较,我做了以下更改.

案例B

BoundingBox Player::GetBoundingBox(void)
{
    return BoundingBox( &GetBoundingSphere() );
}
Run Code Online (Sandbox Code Playgroud)

与变体:我

BoundingBox& l_Bbox = l_pPlayer->GetBoundingBox();
Run Code Online (Sandbox Code Playgroud)

和II:

BoundingBox l_Bbox = l_pPlayer->GetBoundingBox();
Run Code Online (Sandbox Code Playgroud)

该对象l_Bbox仍然没有超出范围.如何"将它绑定到调用函数中的const引用,它的生命周期将扩展到调用函数的范围",真正将对象的生命周期延长到调用函数的范围?

我在这里错过了一些小事吗?

c++ memory const pass-by-reference

9
推荐指数
2
解决办法
2587
查看次数

int foo(type&bar); 是一种不好的做法?

好吧,我们来了.我的C++书籍提出了另一个提议的做法.它说"返回值(非空)函数不应该将引用类型作为参数." 所以基本上如果你要实现这样的函数:

int read_file(int& into){
   ...
}
Run Code Online (Sandbox Code Playgroud)

并使用整数返回值作为某种错误指示符(忽略我们有异常的事实)然后该函数编写得很糟糕它实际上应该像

void read_file(int& into, int& error){

}
Run Code Online (Sandbox Code Playgroud)

现在对我来说,第一个更清晰,更好用.如果要忽略错误值,可以轻松完成.但是这本书暗示了后来的.请注意,本书并未说返回值函数是坏的.它宁愿说你应该只返回一个值,或者你应该只使用引用.

你对此有何看法?我的书上装满了废话吗?(再次)

c++ reference function

3
推荐指数
2
解决办法
404
查看次数

命名构造函数和临时生命周期扩展

我正在寻找一种方法来定义一个"基础"构造函数,它将使用默认值初始化值,然后将该基础扩展为许多专门的构造函数.

我想要的伪代码可能是这样的:

class Foo{
private:
    int val;
    /* ... */

public:
    // Base constructor
    Foo(){ /*...*/ }           // This provides basic initialization of members

    // Named constructors
    static Foo fromString(string s){
        Foo f;                 // Call base constructor
        f.val = s.length();    // Customize base object
        return f;              // Return customized object
    }
    static Foo fromInt(int v){
        Foo f;
        f.val = v;
        return f;
    }
}
Run Code Online (Sandbox Code Playgroud)

起初,我考虑延长临时的生命周期f,但const声明阻止我编辑其成员.所以看来这已经结束了.

然后我尝试了"命名构造函数"方法(如上所示).但是,我必须先修改示例以创建对象,然后修改它,然后返回它.这似乎有效,但我有理由相信它只是一个巧合,因为它f是一个临时的,并且在函数结束时超出了范围.

我也考虑使用像auto_ptrs 这样的东西,但是我正在使用Foo对象以及auto_ptrs到Foo,这使得其余的代码"关心"对象是否通过基础构造函数创建(在这种情况下)它将是一个对象)或通过一个扩展构造函数(在这种情况下它将是一个指针).

如果它有用,在Python中,我会使用这样的东西: …

c++ named-constructor

3
推荐指数
1
解决办法
136
查看次数