0

Goodrich から C++ のデータ構造とアルゴリズムを学んでいます。彼らはこの LinkedList 実装を提供しました。私はコードを理解していますが、そうではありませんが、これをメインクラスで使用することはできません。インスタンスを作成して挿入、削除するにはどうすればよいですか? たとえば、次のようにクラスのインスタンスを作成しようとしました。

StringLinkedList() L;

しかし、それはエラーを示しています: 予想される ";" 'Lの前に

#include <iostream>
#include <string>

using namespace std;

class StringNode {
private:
    string elem;
    StringNode* next;

    friend class StringLinkedList;
};

class StringLinkedList{
public:
    StringLinkedList();
    ~StringLinkedList();
    bool empty() const;
    const string& front() const;
    void addFront(const string& e);
    void removeFront();
private:
    StringNode* head;
};

StringLinkedList::StringLinkedList()
    :head(NULL) {}
StringLinkedList::~StringLinkedList()
    {while (!empty()) removeFront();}
bool StringLinkedList::empty() const
    {return head==NULL;}
const string& StringLinkedList::front() const
    {return head->elem;}
void StringLinkedList::addFront(const string& e){
    StringNode* v = new StringNode;
    v->elem=e;
    v->next = head;
    head=v;
}
void StringLinkedList::removeFront(){
    StringNode* old=head;
    head = old->next;
    delete old;
}


int main () {
}
4

3 に答える 3

3

括弧()は関数呼び出しを示します。変数を宣言する場合の構文は次のとおりです。

Typename variable_name;

オプションで、パラメーターをコンストラクターに渡す必要がある場合があります

Typename variable_name(param);

C++ 11では、統一された初期化構文を使用できます{}が、脱線します。いずれにせよ、変数名のに来ます。あなたの場合、これは機能します:

StringLinkedList L;


あなたが言う時

StringLinkedList() L;

コンパイラは型名を認識し、変数名を期待しますが()、名前の前に取得しますL(ところで、より長い名前に値する可能性があります)。そのため、セミコロンで終わる関数呼び出しを行う必要があると判断しました。しかし、そうではありません、それはで終わる L;ので、あなたは得る

expected ";" before 'L
于 2013-08-20T09:10:35.647 に答える
0

オブジェクトの作成に使用する方法が正しくありません。何を意味しているのかわかりません

StringLinkedList() L;

StringLinkedList() はクラスのコンストラクターの呼び出しであり、クラスのオブジェクトの作成に使用できますが、必要でない限りコンストラクター呼び出しを指定する必要はありません。オブジェクトを作成していて、その作成のためにオブジェクトのデータ メンバーを初期化したい場合は、コンストラクターを使用できます。

StringLinkedList L=StringLinkedList();

は正しい方法ですが、書く必要があるのは

StringLinkedList L;

デフォルトのコンストラクターを自動的に呼び出すためです。実際に発生するプロセスは、コンストラクターが一時オブジェクトを作成し、それをオブジェクト変数 L に割り当てることです。しかし、それは自動的に行われます

このようにリンクリストクラスのオブジェクトを宣言しても問題はありません。

int main ()
{
    StringLinkedList s1;
    s1.addFront("hai");
    s1.addFront("dude");
    s1.removeFront();
    cout<<s1.front();
}
于 2013-08-20T09:13:09.843 に答える