Решение статического индексированного значения - PullRequest
0 голосов
/ 17 февраля 2011

Пожалуйста, смотрите следующий код:

#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 * types :: operator': test.cpp: 53: ошибка: недопустимое применение sizeof к неполному типу typenamepair [] test.cpp: в функции 'int main ()': test.cpp: 87: ошибка: невозможно преобразовать 'types' в 'const char *' при инициализации

Что не так с размером и как я могу это исправить? Кроме того, как я могу использовать возвращенное значение instace, чтобы использовать оператор для получения typename?

Также, пожалуйста, дайте мне знать, если есть лучшее решение. Спасибо

1 Ответ

0 голосов
/ 17 февраля 2011

Для вашей первой ошибки вам нужно переместить код с помощью sizeof до тех пор, пока содержимое массива не будет определено.Существует лучший способ получить размер массива , но он также не может быть использован до тех пор, пока не будет определено его содержимое.

Для вашей второй ошибки у вас есть указатель, поэтому ваш пользовательопределено operator[] не найдено.Измените getInstance, чтобы он возвращал ссылку вместо указателя, и она должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...