2

コンテキストのコード:

class WordTable
{
    public:
        WordTable();
        ~WordTable();

        List* GetListByAlphaKey(char key);
        void AddListByKey(char key);
        bool ListExists(char key);
        bool WordExists(string word);
        void AddWord(string word);
        void IncrementWordOccurances(string word);
        void Print();
    private:     
        List *_listArray[33];
        int _GetIndexByKey(char key);
};


class TableBuilder
{
    public:
    TableBuilder();
    ~TableBuilder();
    void AnalyzeStream(fstream &inputStream);        
    void PrintResults();
    private:
        void _AnalyzeCursor(string data);
        bool _WordIsValid(string data);
        WordTable* _WordTable;        
};

struct Element {
public:
   string Word;
   int Occurances;
   Element* Next;
};


class List
{
    public:
        List();
        ~List();

        Element* AddElement(string word);       
        void DeleteElement(Element* element);       
        void Print();       
        void Delete();
        Element* First;
        bool WordExists(string word);
        void IncrementWordOccurances(string word);      
    private:
        void _PrintElementDetails(Element* element);
};

要件
テキストを分析し、リンクされたリストの配列 (配列には各文字のリストが含まれ、リストにはテキスト内のすべての単語が含まれます) を作成し、結果を出力する必要があります。

問題 WordTable.cpp でリストの配列を初期化できません。何かを誤解していることはわかっていますが、アイデアも時間もありません。誰?

Ps はい、それは宿題です。ベストプラクティスについてのアドバイスはやめてください... :)

4

4 に答える 4

4

の初期化は次の_listArrayようになります。

WordTable::WordTable() {
  for (int i=0; i<33; i++)
    _listArray[i] = new List();
}

問題が何であるかを正確に述べていないので、これが役立つかどうかはわかりません...

于 2009-05-10T22:54:18.560 に答える
3

リストへのポインターの配列を作成しているためです。List _listArray[33]; に変更します。または次のように初期化します。

for ( int i = 0; i < 33; ++i ) {
    _listArray[i] = new List();
}

// and to access methods
_listArray[i]->AddElement( "word" );
于 2009-05-10T22:54:34.223 に答える
3

単語の最初の文字ごとに1つずつ、それらの配列を持つことにより、リンクされたリストを最適化しているようです。そうしないでください。

std::map を使用します。文字列は単語で、int はカウントです。

編集:私のアドバイスを無視すると...指摘されているように、_listArray は実際にはオブジェクトの配列ではなく、ポインターの配列です。オブジェクトの配列が必要だったと思います。配列は固定長であり、List にはデフォルトのコンストラクターがあるため、これを行う最も簡単な方法は、次のように言うことです。

List _listArray[33];

動的割り当てが必要な場合は、代わりにこれを行うことができます。

List* _listArray;

そしてコンストラクターで:

_listArray = new List[33];

そしてデストラクタで:

delete[] _listArray;
于 2009-05-10T22:55:42.253 に答える
0

車輪を再発明しないでください (もう一度) std::list を使用してください。これは正しく機能し、より安全であり、標準です。

2 番目: 設計上の問題があります。リスト内の要素属性は public ですが、private メソッドがあります ???.

于 2009-05-11T14:10:28.690 に答える