gpt4 book ai didi

c++ - 命名构造函数和临时生命周期延长

转载 作者:太空狗 更新时间:2023-10-29 20:05:47 25 4
gpt4 key购买 nike

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

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

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

起初,我想到了extending the lifetime of the temporary f ,但是 const 声明阻止我编辑它的成员。所以这似乎已经结束了。

然后我尝试了 "named constructor"方法(如上所示)。但是,我不得不修改示例以先创建对象,然后修改它,然后返回它。这似乎可行,但我有理由相信这只是巧合,因为 f 是临时的,在函数结束时超出范围。

我也考虑过使用像 auto_ptrs 这样的东西,但后来我同时使用 Foo 对象和 Foo 的 auto_ptrs,这使得其余代码“关心”对象是通过基本构造函数(在这种情况下它将是一个对象)还是通过扩展构造函数之一(在这种情况下它将是一个指针)创建的。

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

class Foo(object):
def __init__(self):
/* Basic initialization */

@classmethod
def fromString(cls, s):
f = Foo() #†
f.val = len(s)
return f

最后,我想这样做有两个原因:

  1. 代码重用,我想将公共(public)初始化从每个构造函数中移到一个构造函数中。我意识到我可以通过每个构造函数调用的 init() 类型的私有(private)方法来完成此操作,但我只想提及这一点。
  2. 阐明并解决歧义。与命名构造函数示例的动机非常相似,参数类型本身不足以确定应使用哪个构造函数。此外,fromSomething 语法非常清晰。

如果有一个简单的解决方案,请原谅我,过去几年我的工作从 C++ 转向 Java/Python,所以我有点生疏。

最佳答案

这是完全有效的:

static Foo fromInt(int v){
Foo f;
f.val = v;
return f;
}

这会在您返回 f 时调用 Foo 的复制构造函数(可能编译器应用了 return value optimization ,因此不会生成任何拷贝)。 f 超出范围,但返回值只是它的一个拷贝,所以这是完全有效的,它起作用不仅仅是“巧合”。

因此,如果您担心使用命名构造函数方法只是因为您不知道它是否有效,请继续使用,它会完美地工作。

关于c++ - 命名构造函数和临时生命周期延长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11365747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com