如何通过一行中的指针构造一个点
How to construct a point by a pointer in one line?
我有一个接受双指针的 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;}() );
有什么更简单的方法可以在一行中构造具有指定值的指针?
最简单的方法是声明一个本地数组并传递指向该数组的指针:
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);
}
[编辑] 这会在堆栈上创建临时数组,因此它将比其他两个选项快得多,它们涉及内存分配(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() );
您的代码不起作用:从 lambda 函数返回的数组在从 lambda 返回后但在将其传递给您想要查看它的构造函数之前被销毁。代码可能看起来有效,但这只是未定义行为的最坏情况。
就个人而言,我认为您应该考虑更好的界面。如果您无法更改界面,则可能需要使用如下内容:
typedef double array[3];
Point pt(&(array{ 1.2, 2.3, 3.4 })[0]);
相关文章:
- 修改函数中的指针(将另一个指针作为参数传递)
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 更改一个指针后更改乘法对象
- 从另一个指针指向函数的指针
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- C:试图将指针值复制到另一个指针中,得到可修改的左值错误
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 我不明白我的错误需要返回一个指针数组
- 使用 SFINAE 测试是否可以将一个指针类型static_cast到另一个指针类型
- 将指针分配给另一个指针时会发生什么情况?
- 如何保存指针地址,以便另一个指针可以继续处理它
- 为什么 std::span 是一个指针 + 大小而不是两个迭代器
- 类的成员应该是一个指针
- 隐式指针变量,在自动定义中具有另一个指针变量
- 利用双重链接列表中的下一个指针
- 你能把一个指针投射到数组中吗?