2012-08-14 60 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。