2012-08-14 99 views
0

我包装,其具有以下结构一个C API的指针:卸下扶养于特定类型

typedef struct Value 
{ 
    union 
    { 
     int i; 
     const char* s; 
     bool b; 
     struct StructureMember_T* firstStructureMember 
     double d; 
    } value; 
} Value_T; 

我使用setter函数在这个结构从C++来设定的值。

class ValueSetter : public IValueSetter 
{ 
public: 
    explicit ValueSetter(Value_T* value) : _value(value) 
    { 
    } 

    void operator()(int8_t v) const 
    { 
     _value->value.i = v; 
    } 

    ... 

    void operator()(std::string& s) const 
    { 
     _value->value.s = s.c_str(); 
    } 

    void operator()(Structure& s) const 
    { 
     _value->value.firstStructureMember = s.getFirstMember(); 
    } 

private: 
    Value_T* _value; 
}; 

要处理StructureMember_T *,我添加了下面这个我不满意的类。例如,其接口依赖于c api中的StructureMember_T。任何关于另一种方法的建议?我将在稍后的日期为Structure类添加更多功能。

class Structure 
{ 
public: 
    explicit Structure(Value_T* firstMember) 
     : _firstMember(firstMember) 
    { 
    } 

    StructureMember_T* getFirstMember() 
    { 
     return _firstMember; 
    } 

    void setFirstMember(StructureMember_T* firstMember) 
    { 
     _firstMember = firstMember; 
    } 

private: 
    StructureMember_T* _firstMember; 
}; 
+1

当分配std :: string时,你可能想要复制字符串(即分配一个char数组并执行一个strcpy)而不是分配内部字符串指针 – Asaf 2012-08-14 10:17:19

+0

Asaf:'strdup()'比手册分配和复制。但除此之外,你是对的。 – Constantinius 2012-08-14 10:31:21

回答

1

考虑到你的目标,我真的没有看到在C++ API中设置setter和getter的问题。

如果你真的想隐瞒那个,我会建议你把Value作为Structure的朋友,并且把get/set方法设置为private。