我有一个Point构造函数,它接受一个双指针。我这样做是为了
Point::Point(double* p)
: mX(p[0]), mY(p[1]), mZ(p[2])
{}
Point pt( []() -> double* {double p[3] = {1, 2, 3}; return p;}() );
使用指定值在一行中构造指针的更简单方法吗?
答案 0 :(得分:4)
最简单的方法是声明一个本地数组并传递一个指针:
double p[3] = {1, 2, 3};
Point pt(p);
或者,考虑编写一个新的构造函数,让您直接传递三个坐标:
Point::Point(double x, double y, double z)
: mX(x), mY(y), mZ(z)
{ }
如果无法添加构造函数,则可以使用工厂:
Point make_point(double x, double y, double z)
{
double p[3] = { x, y, z };
return Point(p);
}
答案 1 :(得分:3)
[编辑]这会在堆栈上创建临时数组,因此它将比其他两个选项快得多,这两个选项涉及内存分配(new
/ delete
):
Point pt( &(double[3]){1, 2, 3}[0] );
为避免内存泄漏并实际返回指针,您必须使其更长一些:
Point pt( std::unique_ptr<double>(
[]() -> double* { return new double[3]{1, 2, 3}; }()
).get() );
另一种选择:
Point pt( std::vector<double>{1,2,3}.data() );
答案 2 :(得分:2)
您的代码不起作用:从lambda函数返回的数组在从lambda返回之后但在将其传递给您想要查看它的构造函数之前被销毁。代码似乎可行,但这只是未定义行为的最坏情况。
就个人而言,我认为你应该考虑一个更好的界面。如果您无法更改界面,可能需要使用以下内容:
typedef double array[3];
Point pt(&(array{ 1.2, 2.3, 3.4 })[0]);