C ++ Getters / Setters,这是一个好方法吗?

时间:2018-11-26 18:33:27

标签: c++ getter-setter

因此原始的Getter / Setter类似于以下样式(添加了其他强制类型转换,也请记住,在这些示例中我使用的是int和float,可能是更复杂的数据)

struct JustAnInteger {
    int i;
};

class Foo {
private:
    int _bar;

public:
    Foo(int bar) : _bar(bar) {}

    void setBar(int bar) { _bar = bar; }

    int getBar() const {
        return _bar;
    }
    double getBarDouble() const {
        return (double)_bar;
    }
    std::string getBarString() const {
        return std::to_string(_bar);
    }
    JustAnInteger getBarJustAnInteger() const {
        return JustAnInteger{ _bar };
    }
};

会通过以下方式改变一个好主意还是一个坏主意?

class Foo {
private:
    int _bar;
public:
    Foo(int bar) : _bar(bar) {}

    void bar(int bar) { _bar = bar; }

    template <class T = int> //int is the original type
    T bar() const;
    template <>
    int bar<int>() const {
        return _bar;
    }
    template <> double bar<double>() const {
        return (double)_bar;
    }
    template <> std::string bar<std::string>() const {
        return std::to_string(_bar);
    }
    template <> JustAnInteger bar<JustAnInteger>() const {
        return JustAnInteger{ bar() };
    }
};

通过这种方式,可以轻松地将_bar的类型更改为浮点型

class Foo{
private:
    float _bar;
public:
    Foo(int bar) : _bar((float)bar) {}
    Foo(float bar) : _bar(bar) {}

    void bar(int bar) { _bar = (float)bar; }
    void bar(float bar) { _bar = bar; }

    template <class T = int>
    T bar() const;
    template <> int bar<int>() const {
        return (int)_bar;
    }
    template <> double bar<double>() const {
        return (double)_bar;
    }
    template <> std::string bar<std::string>() const {
        return std::to_string(_bar);
    }
    template <> JustAnInteger bar<JustAnInteger>() const {
        return JustAnInteger{ bar() };
    }
};

并且不应破坏代码的其他部分

Foo foo(2);
foo.bar(2.999f); //Now we can use floats!
int a = foo.bar(); //Still an int
double b = foo.bar<double>(); //can keep using it, and we gain precision

0 个答案:

没有答案