从函数返回具有常量成员的对象的方法
Ways to return objects with constant members from a function
假设您有一个类,其成员变量声明为常量。
class Test
{
public:
Test(const int const_param) : const_member_(const_param) {}
private:
const int const_member_;
};
我们想要一个函数来返回这个对象的一个实例作为"返回值"
Test Foo();
Test* Foo();
Test& Foo();
或作为"输出参数"(即传入的指针)。
void Foo(Test* test);
void Foo(Test** test); // maybe this is more correct?
注意这个函数是唯一可以创建对象的东西(在上面的例子中,Foo
将是唯一知道const_param
值的东西,因此可以创建Test
对象)
做这样的事情最好的方法是什么?这可能吗?
您可以通过复制返回这样的对象,除非您有充分的理由避免这种设计:
Foo make_foo()
{
int n = get_mystery_value()
Foo x(n);
x.manipulate();
return x;
}
如果你想通过指针处理对象,使用std::shared_ptr<Foo>
代替:
std::shared_ptr<Foo> make_foo()
{
int n = roll_dice();
auto px = std::make_shared<Foo>(n);
px->crazy_stuff();
return px;
};
或者,如果您只需要一个处理程序对象,则使用std::unique_ptr<Foo>
。
一点解释:在对象中有一个常量成员本质上意味着对象本身具有常量对象的语义。可以复制常量,但不能对它们重新赋值,所以在典型的用例中,您只会创建该类的对象一次,而不会对其重新赋值。复制构造函数会自动为您定义,因此您可以直接输入:
int main()
{
Foo x = make_foo();
Foo y(make_foo()); // same thing
x.twiddle();
y.skedaddle();
// ...
}
显然你不能也不会说x = make_foo();
,因为你的x
在语义上是一个常量,对它重新赋值是没有意义的。
我刚刚尝试了以下操作,它工作得很好。
Test* Foo()
{
Test* x = new Test(5);
return x;
}
我想你不需要什么花哨的东西。
工厂函数(具有创建特定类型对象的独占权限的函数)应该使用该类型作为返回值,而不是"按参数返回"。
如果必须通过实参返回,c++没有办法将返回的对象作为临时对象放在堆栈上。因此,新对象必须在堆上。因为在这种情况下,要返回的是指向对象的指针,而不是对象的内容,所以函数实参应该是一个可修改的指针。
原始指针通常是坏消息,因为您必须记得手动正确地设置delete
。智能指针类,如unique_ptr
和shared_ptr
是更好的实践,auto_ptr
更兼容,但使用起来更棘手。
void Foo(unique_ptr< Test > &test) {
test = new Test;
}
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- C++是否有定义的方法来传递指向类的成员对象的成员函数的指针
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 声明成员对象而不调用其默认构造函数
- 指向成员对象的指针 - 中断线程
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 应该在成员对象上调用析构函数
- 调用成员对象的构造函数
- 将 const 类型引用对象注册为类成员对象C++
- 修改类 c++ 中的成员对象
- 从成员对象调用方法
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值
- 构造函数,成员对象
- 不能使外部类成为内部类内的成员对象
- 使用从另一个类继承的类的对象初始化成员对象
- 如何避免需要在初始化列表中初始化成员对象
- 初始化具有参数的类成员对象的正确方法
- 将指针添加到成员对象中的指针动态阵列
- C 将成员对象函数分配给类成员功能