C++;具有setter和getter的属性 我对ARDUNO的C++是新的,我知道许多其他语言的属性。
在C#中,我可以使用setter和getter编写如下属性: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
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++中的属性看起来有负效用,所以它可能没有意义。美学上