带有setter和getter的C ++属性

时间:2016-11-12 05:16:37

标签: c++

你好我刚接触到了d ++的C ++,我知道很多其他语言的属性。

在C#中我可以用setter和getter编写属性,如下所示:

public int foo
{
  get
  {
    return bar;
  }
  set
  {
    bar = value;
  }
}

在C ++中这样的事情是可能的吗? 我找不到一个奇特的解决方案,我可以拆分成头文件和源文件。 :/

4 个答案:

答案 0 :(得分:2)

C ++没有类似C#风格的属性。

但是你可以在头文件中声明一个setter和getter函数,然后在源文件中定义它。

示例:

///in header file
class Test
{
    public:
         int getX();
         void setX(int newX);
    private:
         int x;
}

//in source file

int Test::getX()
{
     return x;
}

void Test::setX(int newX)
{
      x = newX;
}

修改

使用头文件时,应该在其上放置一个标头保护。

阅读:https://en.wikipedia.org/wiki/Include_guard

答案 1 :(得分:0)

class Foo
{
public:
    int get()
    {
        return bar;
    }

    void set( int new_bar )
    {
        bar = new_bar;
    }

private:
    int bar;
};

这会给你一个类名Foo。这个班有私人会员吧。你可以通过set()方法设置bar的值,你可以通过set()方法获得bar的值。

答案 2 :(得分:0)

与C#一样,这种方式不可能,但你可以试试下面的东西。

class Foo
{
public:
    void bar(int val){ _bar=val;}
    int bar(){ return  _bar;}

private:
    int _bar;
};

答案 3 :(得分:0)

编写包装模板类将对您有所帮助。 在类中,通过重载一些特殊函数,您可以追踪对底层对象的访问。

template <class T, class Object, T(Object::*real_getter)(), T(Object::*real_setter)(T const &)> 
class RWProperty 
{ 
private:
    Object * my_object;
public:
    RWProperty() : my_object(0) {}
    RWProperty(Object * me = 0) : my_object(me) {}
    void operator()(Object * obj) { my_object = obj; }
    T operator()() const { return (my_object->*real_getter)(); }
    T operator()(T const & value) { return (my_object->*real_setter)(value); }
    T get() const { return (my_object->*real_getter)(); }
    T set(T const & value) { return (my_object->*real_setter)(value); }
    operator T() const { return (my_object->*real_getter)(); }
    T operator=(T const & value) { return (my_object->*real_setter)(value); }
    typedef T value_type;
};

//Use case from here.
#include <iostream>

struct Widget
{
private:
    int value_;
    int get(void) { std::cout << "Real getter called." << std::endl; return value_; }
    int set(const int& _value) {  std::cout << "Real setter called." << std::endl; return value_ = _value; }
public:
    RWProperty<int, Widget, &get, &set> value;
    Widget(void):value(this){}
};


int main(void)
{
    Widget w;
    w.value = 31337; //Call Widget::set(Called real setter in RWProperty) indirectly.
    std::cout << w.value; //Call Widget::get(Called real getter in RWProperty)
}

您还应该阅读“C ++属性 - 库解决方案”以获取其他信息。 在本文中,介绍了几种由其访问权限键入的属性类。