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 回答
1

您可以创建一个实例并添加和删除这样的项目:

int main () {
    StringLinkedList list; // construct an instance
    list.addFront("foo");  // Add "foo"
    list.addFront("bar");  // Add "bar"
    list.removeFront();    // Remove "bar"
    // List is automatically deleted now
}
于 2013-08-20T08:56:01.380 回答
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 回答