请教C++中的属性实现?
C#中的属性一般为:
public double Number{ set { SetValue(NumberProperty, value); } get { return (double)GetValue(NumberProperty) }}public int Width{ set { SetValue(WidthProperty, value); } get { return (int)GetValue(WidthProperty) }}public int Height{ set { SetValue(HeightProperty, value); } get { return (int)GetValue(HeightProperty) }}// declspec_property.cppstruct S { int i; void putprop(int j) { i = j; } int getprop() { return i; } __declspec(property(get = getprop, put = putprop)) int the_prop;//定义属性};int main() { S s; s.the_prop = 5; return s.the_prop;}
[解决办法]
C++属性
_declspec(property(put=setJobID, get=getJobID)) unsigned long jobID; void setJobID(unsigned long inJobID); unsigned long getJobID() const;
[解决办法]
codeproject上也有下面这样的宏
#define PROPERTY(t,n) __declspec( property ( put = property__set_##n , get = property__get_##n ) ) t n;\ typedef t property__tmp_type_##n;#define READONLY_PROPERTY(t,n) __declspec( property (get = property__get_##n) ) t n;\ typedef t property__tmp_type_##n;#define WRITEONLY_PROPERTY(t,n) __declspec( property (put = property__set_##n) ) t n;\ typedef t property__tmp_type_##n#define GET(n) property__tmp_type_##n property__get_##n() #define SET(n) void property__set_##n(const property__tmp_type_##n& value)
[解决办法]
扩展了下,不过没做到和C#语法一致
#include <iostream>using namespace std;#define PROPERTY(t,n) __declspec( property ( put = property__set_##n , get = property__get_##n ) ) t n;\ typedef t property__tmp_type_##n;#define READONLY_PROPERTY(t,n) __declspec( property (get = property__get_##n) ) t n;\ typedef t property__tmp_type_##n;#define WRITEONLY_PROPERTY(t,n) __declspec( property (put = property__set_##n) ) t n;\ typedef t property__tmp_type_##n#define GET(n) property__tmp_type_##n property__get_##n() #define SET(n) void property__set_##n(const property__tmp_type_##n& value) class Value{public: template<typename T> void SetValue(T& dst, const T& src) { dst = src; } template<typename T> T GetValue(const T& tag) { return tag; }};class A : Value{public: PROPERTY(int, Width); SET(Width) {SetValue(_width, value);} GET(Width) { return (int)GetValue(_width);} WRITEONLY_PROPERTY(int, Height); SET(Height) {SetValue(_height, value);}private: int _width; int _height;};int main(){ A a; a.Width = 2; a.Height = 3; cout << a.Width <<endl;; cout << a.Height<<endl; // error, no get return 0;}