我确信这个问题在这里被触及了很多次,但我真的找不到我遇到的问题类型的答案。我有一个需要在里面装一个数组的类。但是该数组的类型是可靠的(确切地说,它取决于打开的波形文件的比特率,例如8位 - 字符,16位 - 短等)。我需要在其中一个类方法中定义它。
我的想法是使用auto
关键字来声明指针:
class WaveReader {
//
auto *data;
};
然后,在方法内:
void some_func(int datasize)
{
//
case 8:
data = new char[datasize];
break;
case 16:
data = new short[datasize];
break;
//
etc.
}
但这是一个愚蠢的想法。我知道最简单的方法是为每种类型声明数组,但我想知道是否有一种聪明的方法,也许使用一些模板? 非常感谢您的帮助。
答案 0 :(得分:2)
auto
关键字不是为此设计的,请将数据声明为:
void* data;
然后,您可以使用int或enum来跟踪数据类型。如,
typedef enum
{
CHAR,
SHORT
} DataTypeEnum;
...
DataTypeEnum dataType;
...
并按如下方式修改您的代码:
void some_func(int datasize)
{
//
case 8:
data = static_cast<void*>(new char[datasize]);
dataType = CHAR;
break;
case 16:
data = static_cast<void*>(new short[datasize]);
dataType = SHORT;
break;
//
etc.
}
...
if( dataType == CHAR )
{
...
}
else if ( dataType == SHORT )
{
...
}
答案 1 :(得分:1)
您可能想要考虑“这是什么意思”。是的,有些情况下,这种类型(例如由jsidhu解决)的东西正是你想要和需要的。但通常它表明你试图做“不太正确的方式”。
另一种方法是使用虚拟功能:
class Base
{
public:
virtual void do_stuff_with_data() = 0;
}
class CharData
{
private:
char * data;
public:
CharData(size_t size) { data = new char[size]; }
void do_stuff_with_data() { ... };
};
class ShortData
{
private:
short* data;
public:
ShortData(size_t size) { data = new short[size]; }
void do_stuff_with_data() { ... };
};
void some_func(int datasize)
{
Base *pBase;
case 8:
pBase = new CharData(datasize);
break;
case 16:
pBase = new ShortData(datasize);
break;
//
etc.
pBase->do_stuff_with_data();
}
答案 2 :(得分:0)
多种数据类型。您可以使用相同的名称创建单独的重载函数。根据传递的数据类型,它将使用正确的功能。 然后,该函数可以使用in。
调用正确的类答案 3 :(得分:0)
我会使用工会来完成工作:
union {
int8_t *i8;
int16_t *i16;
/* ... */
} data;
// snip
switch (bitsPerSample) {
case 8:
dataType = CHAR;
break;
case 16:
dataType = SHORT;
break;
default:
// throw
}
data.i8 = new int8_t[datasize * bitsPerSample / CHAR_BIT];
do_8bit(data.i8);
// or
do_16bit(data.i16);
delete[] data.i8;
由于您只存储POD,因此如果您分配N * 2 char
s或N short
s无关紧要,并且您可以使用正确的指针类型而不进行强制转换。
另外:来自<inttypes.h>
的整数类型,因为“基本”整数类型的绝对大小没有garantuee。