Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态索引值的解决方案_C++_Singleton_Operator Overloading - Fatal编程技术网

C++ 静态索引值的解决方案

C++ 静态索引值的解决方案,c++,singleton,operator-overloading,C++,Singleton,Operator Overloading,请参阅以下代码: #include <iostream> #include <string> using namespace std; enum dataType { DATATYPE_BYTE, DATATYPE_CHAR, DATATYPE_UCHAR, DATATYPE_SHORT, DATATYPE_USHORT, DATATYPE_INT, DATATYPE_UINT, DATATYPE_LO

请参阅以下代码:

#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;
}
#包括
#包括
使用名称空间std;
枚举数据类型{
数据类型_字节,
数据类型_CHAR,
数据类型_UCHAR,
数据类型_SHORT,
数据类型_USHORT,
数据类型_INT,
数据类型单元,
数据类型_LONG,
数据类型_ULONG,
数据类型_FLOAT,
数据类型_UFLOAT,
数据类型_DOUBLE,
数据类型_UDOUBLE,
数据类型_BLOB,
数据类型_字符串,
数据类型复杂,
数据类型\u更多,
数据类型错误
};
typedef结构typenamepair\u{
常量数据类型名称;
常量字符*常量名称;
}类型名对;
类类型{
私人:
typenamepair*typesArr;
静态typenamepair类型[];
静态类型*实例;
公众:
静态类型*getInstance(){
if(!instance_389;)
实例=新类型;
返回实例;
}
常量字符*运算符[](数据类型typeEnum)
{
for(unsigned int i=0;i<(sizeof(types::types)/sizeof(typenamepair));++i){
if(i==类型[i].name)
返回类型[i].nameval;
}
//无法获取值。返回错误
返回类型[数据类型\错误].nameval;
}
};
types*types::instance_uz=NULL;
typenamepair类型::类型[]={
{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”},
//未知类型!
{DATATYPE_ERROR,“ERROR”}
};
main()
{
常量字符*测试=(类型::getInstance())[DATATYPE_UINT];

cout对于您的第一个错误,您需要使用
sizeof
移动代码,直到定义了数组内容。但是在定义了内容之前,也不能使用它


对于第二个错误,您有一个指针,因此找不到您的用户定义的
运算符[]
。更改
getInstance
以返回一个引用而不是指针,它应该可以工作。

您能解释一下如何使用.nameval吗?@Kiran:对不起,我没有看到您试图重新定义
运算符[]
。问题是用户定义的
运算符[]
存在于
类型
上,而不是
类型*
运算符[]
在指针上总是意味着数组访问,无法重新定义。用引用替换指针,一切都应该正常。如果您不介意,可以向我解释(&)的意义吗在这个解决方案中?
template std::size\u t size(t(&)[N]){return N;}
@Kiran,它意味着一个引用。
t&
将是对单个
t
对象的引用,
t(&)[N]
是对N
T
对象数组的引用。1.单例与您的问题无关。简化您的示例将有助于我们帮助您2.您可以使用
dataType
作为数组的索引,因此无需对iTunes进行迭代,也不能使用dataType作为索引,因为它需要根据API sp定义ecs,下次一定要删除不相关的代码,谢谢,如果不是单例,还有什么选择?