2011-02-17 78 views
0

請參見下面的代碼:解決靜態索引值

#include <iostream> 
#include <string> 

using namespace std; 

enum dataType { 
    DATATYPE_BYTE, 
    DATATYPE_CHAR, 
    DATATYPE_UCHAR, 
    DATATYPE_SHORT, 
    DATATYPE_USHORT, 
    DATATYPE_INT, 
    DATATYPE_UINT, 
    DATATYPE_LONG, 
    DATATYPE_ULONG, 
    DATATYPE_FLOAT, 
    DATATYPE_UFLOAT, 
    DATATYPE_DOUBLE, 
    DATATYPE_UDOUBLE, 

    DATATYPE_BLOB, 
    DATATYPE_STRING, 
    DATATYPE_COMPLEX, 

    DATATYPE_MORE, 
    DATATYPE_ERROR 
}; 

typedef struct typenamepair_ { 
    const dataType name; 
    const char* const nameval ; 
} typenamepair; 

class types { 
    private: 
     typenamepair *typesArr; 
     static typenamepair TYPES[]; 
     static types* instance_; 
    public: 
     static types* getInstance() { 
      if (!instance_) 
       instance_ = new types; 

      return instance_; 
     } 
     const char* operator[](dataType typeEnum) 
     { 
      for (unsigned int i = 0; i < (sizeof(types::TYPES)/sizeof(typenamepair)); ++i) { 
       if (i == TYPES[i].name ) 
        return TYPES[i].nameval; 
      } 
      // failed to get value. return error 
      return TYPES[DATATYPE_ERROR].nameval; 
     } 
}; 

types* types::instance_ = NULL; 
typenamepair types::TYPES[] = { 
    { DATATYPE_BYTE, "byte" }, 
    { DATATYPE_CHAR, "char" }, 
    { DATATYPE_UCHAR, "u_char" }, 
    { DATATYPE_SHORT, "short" }, 
    { DATATYPE_USHORT, "u_short" }, 
    { DATATYPE_INT, "int" }, 
    { DATATYPE_UINT, "u_int" }, 
    { DATATYPE_FLOAT, "float"}, 
    { DATATYPE_UFLOAT, "u_float"}, 
    { DATATYPE_DOUBLE, "double"}, 
    { DATATYPE_UDOUBLE, "u_double"}, 
    { DATATYPE_STRING, "cstring"}, 
    { DATATYPE_BLOB, "blob"}, 
    { DATATYPE_COMPLEX, "complex"}, 
    { DATATYPE_MORE, "more"}, 

    // Unknown type! 
    { DATATYPE_ERROR, "ERROR"} 
}; 


main() 
{ 
    const char* test = (types::getInstance())[DATATYPE_UINT] ; 
    cout << test << endl; 
} 

給了我下面的編譯錯誤:

TEST.CPP:在成員函數'爲const char *類型::經營者: test.cpp:53:錯誤:應用'sizeof'到不完整類型'typenamepair []' test.cpp:在函數'int main()'中: test.cpp:87:error:can not convert'types '初始化爲'const char *'

尺寸大小有什麼問題,我該如何解決? 另外,如何使用返回的instace來使用操作符來獲取類型名?

此外,請讓我知道是否有更好的解決方案。 謝謝

+0

1. singleton與您的問題無關。簡化你的例子將有助於我們幫助你 2.你可以使用`dataType`作爲你的數組的索引,所以你不需要迭代它 – 2011-02-17 16:28:45

+0

不幸的是,不能使用數據類型作爲索引,因爲它需要根據API規格。下次將確保刪除不相關的代碼。謝謝。如果不是單身人士,有什麼選擇? – Kiran 2011-02-17 18:19:42

回答

0

對於第一個錯誤,您需要使用sizeof移動代碼,直到數組內容被定義之後。有a better way to get the array size但它也不能使用,直到內容被定義。

對於第二個錯誤,您有一個指針,因此您的用戶定義的operator[]未找到。更改getInstance返回引用而不是指針,它應該工作。