1

我确信这个问题在这里被多次触及,但我真的找不到我遇到的问题类型的答案。我有一个类需要在里面保存一个数组。但是该数组的类型是可靠的(确切地说,它取决于打开的波形文件的比特率,例如 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.
}

但那是个愚蠢的主意。我知道最简单的方法是为每种类型声明数组,但我想知道是否有一种聪明的方法,也许使用一些模板?非常感谢您的帮助。

4

4 回答 4

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 )
{
    ...
}
于 2013-07-23T12:52:41.330 回答
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(); 
}
于 2013-07-23T13:08:30.817 回答
0

多种数据类型。您可以使用相同的名称创建单独的重载函数。根据传递的数据类型,它将使用正确的函数。然后该函数可以从 in 中调用正确的类。

于 2013-07-23T12:39:34.000 回答
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;

char由于您只存储 POD,因此分配 N*2或 N都没有关系,short您可以使用正确的指针类型而无需强制转换。

另外:整数类型,<inttypes.h>因为“基本”整数类型的绝对大小没有保证。

于 2013-07-23T14:42:28.670 回答