Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;具有setter和getter的属性 我对ARDUNO的C++是新的,我知道许多其他语言的属性。_C++ - Fatal编程技术网

C++;具有setter和getter的属性 我对ARDUNO的C++是新的,我知道许多其他语言的属性。

C++;具有setter和getter的属性 我对ARDUNO的C++是新的,我知道许多其他语言的属性。,c++,C++,在C#中,我可以使用setter和getter编写如下属性: public int foo { get { return bar; } set { bar = value; } } C++中有可能是这样的吗? 我找不到一个可以拆分为头文件和源文件的奇特解决方案:/ C++没有类似C风格的属性。 但您可以在头文件中声明setter和getter函数,然后在源文件中定义它 例如: ///in header file class Test { pub

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

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

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

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;
}
编辑:

在处理头文件时,您应该在其上设置头保护

阅读以下内容:

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;
}
编辑:

在处理头文件时,您应该在其上设置头保护

请阅读以下内容:

这将为您提供一个类名Foo。这个类有一个私有成员bar。可以通过set()方法设置bar的值,也可以通过set()方法获取bar的值

这将为您提供一个类名Foo。这个类有一个私有成员bar。您可以通过set()方法设置bar的值,也可以通过set()方法获得bar的值。

就像C#不可能采用相同的方法,但您可以尝试以下方法

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

private:
    int _bar;
};
像C#不可能用同样的方法,但你可以尝试下面的方法

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

private:
    int _bar;
};

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

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)
}
模板
类属性
{ 
私人:
对象*我的对象;
公众:
RWProperty():我的_对象(0){}
RWProperty(Object*me=0):我的_对象(me){}
void操作符()(Object*obj){my_Object=obj;}
T运算符()()常量{return(my_object->*real_getter)(;}
T运算符()(T常量和值){return(my_object->*real_setter)(value)}
T get()常量{return(my_object->*real_getter)(;}
T set(T const&value){return(my_object->*real_setter)(value)}
运算符T()常量{return(my_object->*real_getter)(;}
T运算符=(T常量和值){return(my_object->*real_setter)(value)}
类型定义T值_类型;
};
//从这里开始使用用例。
#包括
结构小部件
{
私人:
int值;

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

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)
}
模板
类属性
{ 
私人:
对象*我的对象;
公众:
RWProperty():我的_对象(0){}
RWProperty(Object*me=0):我的_对象(me){}
void操作符()(Object*obj){my_Object=obj;}
T运算符()()常量{return(my_object->*real_getter)(;}
T运算符()(T常量和值){return(my_object->*real_setter)(value)}
T get()常量{return(my_object->*real_getter)(;}
T set(T const&value){return(my_object->*real_setter)(value)}
运算符T()常量{return(my_object->*real_getter)(;}
T运算符=(T常量和值){return(my_object->*real_setter)(value)}
类型定义T值_类型;
};
//从这里开始使用用例。
#包括
结构小部件
{
私人:
int值;

int get(void){std::cout与一个属性一起实现一个概念“值”作为数据成员或计算可以随意更改,而不影响使用表示法。Bertrand Meyer称之为。但是简单的访问器和修改器函数也可以支持统一访问原则,因此这不是属性本身的优势;相反,如果属性不支持该原则,这将是一个劣势。因此,在工具中无法检测到的属性,似乎具有负效用。在C++中,可以用简单的直接赋值和转换操作符实现直接暴露的成员变量。它有一些开销。而且由于C++中的属性看起来有负效用,所以它可能没有意义。美学上,通过属性实现概念上的“价值”作为数据成员或计算可以随意更改,而不影响使用表示法。Bertrand Meyer称之为。但是简单的访问器和修改器函数也可以支持统一访问原则,因此这不是属性本身的优势;相反,如果属性不支持该原则,这将是一个劣势。因此,在工具中无法检测到的属性,似乎具有负效用。在C++中,可以用简单的直接赋值和转换操作符实现直接暴露的成员变量。它有一些开销。而且由于C++中的属性看起来有负效用,所以它可能没有意义。美学上