2017-10-21 59 views
-1

我正在爲一個項目數據解析器工作的類。我要解析可以包含兩種不同類型的對象的文件:實現不同的參數集

類型-1: SB0 hardrectilinear 4(0,0)(0,82)(199,82)(199,0)

類型1必須作爲類塊存儲,具有以下屬性:BlockID,BlockType,number_of_edges,lowerleft,rightright,upperleft,upperright。

類型2: SB1 softrectangular 24045 0.300 3.000

類型2也必須被存儲作爲一類塊,具有以下屬性:BLOCKID,BlockType,面積,min_aspectRatio,max_aspectRatio。

是否有可能建立所謂的「塊」一個類,有一組不同的視屬性「BlockType」的論點?我已經構建了一個解析器,但是我使用sstream爲每個BlockType使用了兩個不同的類。

我已經表明我的實現解析器的時候要分析的文本文件只包含2型。關於如何使用單個類來完成此操作的任何想法?

SoftBlock.h:

#ifndef SOFTBLOCKLIST_H_ 
#define SOFTBLOCKLIST_H_ 
#include <string> 
#include <vector> 
#include "SoftBlock.h" 
#include <fstream> 


class SoftBlockList { 
public: 
    SoftBlockList(std::string input_file); 

    std::vector<SoftBlock> get_softblocklist(); 

private: 
    std::vector<SoftBlock> softblocklist; 

}; 

#endif /* SOFTBLOCKLIST_H_ */ 

SoftBlock.cpp: 

#include "SoftBlockList.h" 
using namespace std; 

SoftBlockList::SoftBlockList(string input_file) { 
    ifstream filehandle; 
    filehandle.open(input_file.c_str()); 
    string temp; 
    while(filehandle.good()){ 
     getline(filehandle, temp); 
     SoftBlock block(temp); 
     softblocklist.push_back(block); 
    } 
    filehandle.close(); 
} 

vector<SoftBlock> SoftBlockList::get_softblocklist(){return 
softblocklist;} 
+0

「class block」是什麼意思?請提供一些代碼,顯示您想要實現的內容。 –

+0

聽起來也許用例的模板。 –

+0

我的意思是一個叫做塊的類。我編輯了這個問題。基本上,解析器來解析上述兩種不同類型的線的成稱爲「塊」的類。但取決於「BlockType」屬性,它必須具有不同的屬性。 –

回答

0

一個簡單的方法來做到這一點是使用工會。工會一次只能有1個活躍成員,並且只佔用與最大成員相同的大小。

#include <iostream> 
using namespace std; 

class Block { 
    public: 
    struct Type1 { 
     int number_of_edges; 
     float lowerleft, lowerright, upperleft, upperright; 
    }; 
    struct Type2 { 
     double area; 
     float min_aspectRatio, max_aspectRatio; 
    }; 

    union combinedData { 
     Type1 t1; 
     Type2 t2; 
    }; 

    int BlockID; 
    int BlockType; 

    combinedData data; 
}; 

int main() { 
    Block block; 
    block.BlockType = 1; 
    block.data.t1.number_of_edges = 1; // Type1 is now active 
    cout << block.data.t1.number_of_edges << endl; 
    block.BlockType = 2; 
    block.data.t2.area = 1.5678; // Switched to Type2 being the active member 
    cout << block.data.t2.area << endl; 
} 

然後,您可以使用BlockType的值來確定哪個成員處於活動狀態。