如何简化仅将参数复制到其字段的 C++ 构造函数?

问题描述 投票:0回答:3

这就是我所拥有的:

class Vector3 {
    private:
        float x;
        float y;
        float z;
    public:
        Vector3(float x = 0, float y = 0, float z = 0) {
            this->x = x;
            this->y = y;
            this->z = z;
        }
        ...
};

我发现

this->something = something
非常重复。 我只是想用一次参数构造 Vector3 和

然后不再访问这些字段,只需使用方法添加 Vector3 的。

有什么方法可以简化构造函数而不必做

this->something = something
? 或者有什么方法可以“密封”字段?

c++ constructor simplify
3个回答
1
投票

使用聚合类。那真的是唯一的选择。这不是 good 替代品,但它是唯一的替代品。

struct Vector3 {
    float x = 0;
    float y = 0;
    float z = 0;
};

class Vector3Thing {
    private:
        Vector3 vec;
    public:
        Vector3Thing(Vector3 vec_) : vec(vec_) {}
        ...
};

0
投票

使用 std::array 和 std::initializer_list。

class Vector3
{
    enum elem
    {
        x,
        y,
        z,
        cnt
    };
    std::array<float, cnt> vec;
public:
    Vector3(const std::initializer_list<float>& list = {0.f,0.f,0.f})
    {
        int i = 0;
        for (const auto& e : list)
            vec[i++] = e;
    }
    float get_x() { return vec[x]; }
    float set_x(float data) { vec[x] = data; }
};

可以这样用

Vector3 a = { 1.f,2.f,3.f };
Vector3 b{ 1.f,2.f,3.f };

0
投票

有什么方法可以简化构造函数,使其不必执行此操作->某事=某事?

您可以使用member initializer list来初始化数据成员:

class Vector3 {
    private:
        float x;
        float y;
        float z;
    public:
        Vector3(float x = 0, float y = 0, float z = 0): x(x), y(y), z(z) 
        {
        }
        ...
};
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.