C ++ 0x指定的初始化器

时间:2013-03-08 11:13:55

标签: c++ visual-c++ c++11 c++-cli

我可以找到一种方法在C ++ 0x中执行指定初始化器,只有一个成员初始化。 有多种成员初始化的方法吗?

public struct Point3D
{
    Point3D(float x,y) : X_(x) {}
    float X;
};

我想:

public struct Point3D
{
    Point3D(float x,y,z) : X_(x), Y_(y), Z_(z) {}
    float X_,Y_,Z_;
};

2 个答案:

答案 0 :(得分:4)

你的构造函数中有一些错误,这是你应该如何写它:

/* public */ struct Point3D
// ^^^^^^ 
// Remove this if you are writing native C++ code!
{
    Point3D(float x, float y, float z) : X_(x), Y_(y), Z_(z) {}
    //               ^^^^^    ^^^^^
    //               You should specify a type for each argument individually
    float X_;
    float Y_;
    float Z_;
};

请注意,本机C ++中的public关键字的含义与您可能期望的含义不同。只需删除它。

此外,初始化列表(您错误地称之为"指定的初始化器")不是C ++ 11的新功能,它们一直存在于C ++中。

答案 1 :(得分:0)

@Andy解释了如果你要定义自己的struct,你应该怎么做。

然而,还有另一种选择:

#include <tuple>

typedef std::tuple<float, float, float> Point3D;

然后将一些函数定义为:

//non-const version
float& x(Point3D & p) { return std::get<0>(p); }
float& y(Point3D & p) { return std::get<1>(p); }
float& z(Point3D & p) { return std::get<2>(p); }

//const-version
float const& x(Point3D const & p) { return std::get<0>(p); }
float const& y(Point3D const & p) { return std::get<1>(p); }
float const& z(Point3D const & p) { return std::get<2>(p); }

完成!

现在你将它用作:

Point3D p {1,2,3};
x(p) = 10; // changing the x component of p!
z(p) = 10; // changing the z component of p!

代替p.x代表x(p)

希望能为您提供一些关于如何重用现有代码的起点。