如何通过一行中的指针构造一个点?

时间:2013-10-06 03:19:01

标签: c++ c++11

我有一个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;}() );

使用指定值在一行中构造指针的更简单方法吗?

3 个答案:

答案 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]);