0

这里只是一个非常快速的问题。我正在使用虚拟函数从文本文件中读取。现在,它是虚拟的,因为一方面我希望将值标准化,另一方面我不希望它们标准化。我试图这样做:

bool readwav(string theFile, 'native');

所以理论上,如果使用'native',则应该调用此方法,但是,如果调用'double',则调用该方法的不同版本。如果值为空,则相同,它应该只执行本机选项。

第一个问题,为什么上面的声明不起作用?另外,这是最好的下山路线吗?或者,最好只有一个在选项之间切换的类方法。

谢谢 :)

更新:

我哪里错了?

bool Wav::readwav(string theFile, ReadType type = NATIVE)
{
// Attempt to open the .wav file
ifstream file (theFile.c_str());

if(!this->readHeader(file))
{
    cerr << "Cannot read header file";
    return 0;
}

for(unsigned i=0; (i < this->dataSize); i++)
{
    float c = (unsigned)(unsigned char)data[i];

    this->rawData.push_back(c);
}

return true;
}

bool Wav::readwav(string theFile, ReadType type = DOUBLE)
{
  // Attempt to open the .wav file
  ifstream file (theFile.c_str());

  cout << "This is the double information";
  return true;
 }
4

3 回答 3

3

因为'native'是多字符字符,而不是字符串。不过,我会使用该功能的多个版本:

bool readwavNative(string theFile);
bool readwavDouble(string theFile);

或至少enum作为第二个参数:

enum ReadType
{
   ReadNative,
   ReadDouble
};

//...
bool readwav(string theFile, ReadType type);
于 2012-09-10T09:35:34.073 回答
1

问题中有 oop,所以我假设需要一个 oop 答案。我认为战略模式会适合您的目的。

class WavReader
{
public:
    WavReader(const std::string fileName)
    {
        //open file and prepare to read
    }

    virtual ~WavReader()
    {
        //close file
    }

    virtual bool read()=0;
};

class NativeWavReader: public WavReader
{
public:
    NativeWavReader(const std::string fileName): WavReader(fileName){}

    virtual bool read()
    {
        //native reading method
        std::cout<<"reading\n";
        return true;
    }
};

NativeWavReaderread从 strategy实现方法WavReader,如果您想要另一种方法,您可以创建一个OtherWavReader以不同方式读取文件的类。

于 2012-09-10T09:51:13.713 回答
1

听起来你想要的是一个带有默认参数的枚举。

enum FileType
{
  NATIVE=0,
  DOUBLE      
};

bool readwav(string theFile, FileType type = NATIVE);

默认参数存在于函数声明中,不要将它们放在定义中。

bool readwav(string theFile, FileType type)
{
  switch(type)
  {
    case NATIVE: { ... } break;
    case DOUBLE: { ... } break;
    default: { ... } break;
  }
}

这样,readwav不带参数的调用将NATIVE默认使用该类型。

readwav("myfile.wav"); // Uses NATIVE type
readwav("myfile.wav", NATIVE); // Also uses NATIVE
readwav("myfile.wav", DOUBLE); // Uses DOUBLE type
于 2012-09-10T09:37:35.263 回答