你好我刚接触到了d ++的C ++,我知道很多其他语言的属性。
在C#中我可以用setter和getter编写属性,如下所示:
public int foo
{
get
{
return bar;
}
set
{
bar = value;
}
}
在C ++中这样的事情是可能的吗? 我找不到一个奇特的解决方案,我可以拆分成头文件和源文件。 :/
答案 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;
}
修改强>
使用头文件时,应该在其上放置一个标头保护。
答案 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 ++属性 - 库解决方案”以获取其他信息。 在本文中,介绍了几种由其访问权限键入的属性类。