我正在学习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 () {
}
答案 0 :(得分:3)
括号()
表示函数调用。如果要声明变量,则语法为
Typename variable_name;
或者,您可能需要将参数传递给构造函数
Typename variable_name(param);
在C ++ 11中,统一初始化语法允许您使用{}
但我离题了。无论哪种方式,他们来后变量名称。
在您的情况下,这有效:
StringLinkedList L;
当你说
StringLinkedList() L;
编译器看到一个类型名,然后需要一个变量名,但在名称()
之前得到L
(BTW - 它可能值得一个更长的名字)所以决定你必须进行函数调用,哪个应以分号结尾。但它没有,它以L;
结束,所以你得到了
expected ";" before 'L
答案 1 :(得分: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
}
答案 2 :(得分: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();
}