2

我已经处理了几天的问题,但仍然没有适当的解决方案。想象一下,我有几种(数量可能不同)乐器。每个仪器产生不同类型的数据。对于每种乐器,我都有一个结构(我在这里展示了非常简单的近似值):

struct TInstrument1 {
    int Variable1;
    int Variable2;
}

struct TInstrument2 {
    int Variable3;
} 

我正在尝试创建一种数据库来查看可用数据。我这样做的方式如下:

首先,我有一个做文件映射的类。我在 Windows 上编程,所以我在函数中使用CreateFile, CreateFileMapping,函数:MapViewOdFileMapFile

template <class SType> class TFileMapping {

    HANDLE    hFile;
    HANDLE    hFileMap;

    SType  *  MapView;

    TFileMapping();
    ~TFileMapping();

    void MapFile(String FileName,DWORD FileAccessType,DWORD FileSharing,DWORD MappingAccessType,DWORD MapViewAccessType,DWORD FlagsAndAttributes,DWORD CreationDisposition,size_t ByteNum);
    void UnMapFile();

};

然后在结构中使用这个类TMapVector(我给出一个简化版本):

template <class SType> struct TMMapVector : public TFileMapping<SType> {

    String MappedFileName;

    unsigned int   * AssignedLen;
    unsigned int   * Num;
    SType          * Data;

    TMMapVector();
    ~TMMapVector();

    void   MapVector(String FileName);
    void   AppendItem(SType * Val);
    
    int    size();

};

这个想法是,例如TMapVector<Instrument1>创建/打开一个对应于Instrument1并包含类型对象的数据库文件Instrument1

现在我遇到的问题是我不知道用户有多少种仪器。目前有 3 个,但代码应该很容易扩展到更多的仪器类型。目前我处理如下。我有一堂TFileInfo有两种乐器类型的课,但只有一种被填满。这让我可以进一步使用std::vector<TFileInfo>. 这种方法的问题在于,每次我需要使用仪器做某事时,我都必须使用 switch 语句:

struct TFileInfo {

    TMMapVector<TInstrument1>  Instrument1;
    TMMapVector<TInstrument2>  Instrument2;

};

struct TDataBase {
    std::vector<TFileInfo> FileInfo;
    std::vector<char>      InstrumentType;
    
    int GetNumberOfItemsInArchive(int ArchIdx);
}

int TDataBase::GetNumberOfItemsInArchive(int ArchIdx) {
    switch InstrumentType[ArchIdx] {
        case 1:
            return(FileInfo[ArchIdx].Instrument1.size());
        case 2:
            return(FileInfo[ArchIdx].Instrument2.size());
    }
}

想象一下,如果我需要再添加 10-100 种乐器,当然我不仅有 size() 函数,还有更多。有没有更简单的方法来实现这个?我在考虑接口,但是(1)如果我理解正确的虚函数不能与模板一起使用,(2)我对数据执行相同的操作,只是类型不同。我非常感谢您的建议。

4

1 回答 1

0

根本原因是您无法对struct.

使用可能会更好class TInstrument1 : public std::tuple<int, int>。这将使您能够访问<tuple>.

话虽如此,这对您来说可能是一个挑战。代码喜欢unsigned int * Num; int size();表明您是初学者。在这种情况下,更好的建议可能是使用标准数据库。

于 2020-08-28T09:31:55.910 回答