2017-10-21 14 views
-1

私はプロジェクトのデータパーサーを開発中です。異なる引数セットを持つ単一のクラスを実装する

タイプ1: SB0のhardrectilinear 4(0、0)、(0、82)(199、82)(199、0)

Iオブジェクトの二つの異なるタイプを含むことができるファイルを解析しなければなりません

Type-1は、BlockID、BlockType、number_of_edges、lowerleft、lowerright、upperleft、upperrightの属性を持つクラスブロックとして格納する必要があります。

タイプ2:BLOCKID、BlockType、領域、min_aspectRatio、max_aspectRatio:タイプ2 24045 0.300 3.000

softrectangular SB1は、次の属性を持つ、クラスブロックとして格納されなければなりません。

属性 "BlockType"に応じて異なる引数セットを使用して、 "block"という単一のクラスを構築できますか?私はパーサーを構築しましたが、sstreamを使用して各BlockTypeに対して2つの異なるクラスを使用しました。

解析対象のテキストファイルにタイプ2しか含まれていない場合は、パーサの実装を示しました。どのように私はこれを1つのクラスを使用して行うことができますか?

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

"クラスブロック"とはどういう意味ですか?達成したいことを示すコードを提供してください。 –

+0

テンプレートのユースケースのように聞こえるかもしれません。 –

+0

私はブロックと呼ばれるクラスを意味しました。私は質問を編集しました。基本的に、パーサは、上記の2つの異なるタイプの行を "ブロック"と呼ばれる単一のクラスに解析する必要があります。しかし、属性 "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の値を使用して、アクティブなメンバーを特定できます。

関連する問題