我正在从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 () {
}
括号()
表示函数调用。如果你想声明一个变量,语法是
Typename variable_name;
可选地,您可能需要将参数传递给构造函数
Typename variable_name(param);
在C++11中,统一的初始化语法允许您使用{}
,但我离题了。无论哪种方式,它们都位于变量名之后。在您的情况下,这是有效的:
StringLinkedList L;
当你说
StringLinkedList() L;
编译器看到一个类型名,然后期望一个变量名,但在名称L
之前得到()
(BTW-它可能应该有一个更长的名称),因此决定您必须进行一个函数调用,该调用应该以分号结束。但它不是,它以L;
结束,所以你得到
expected ";" before 'L
您可以创建一个实例并添加和删除项,如下所示:
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
}
您用于创建对象的方法不正确我不知道是什么意思
StringLinkedList() L;
StringLinkedList()是对类的构造函数的调用,它可以用于创建类的对象,但除非需要,否则不需要指定构造函数调用。如果您正在创建对象,并且还想初始化对象的数据成员以进行创建,则可以使用构造函数。
StringLinkedList L=StringLinkedList();
是正确的方法吗但是你只需要写
StringLinkedList L;
因为它将自动调用默认构造函数。实际发生的过程是构造函数创建一个临时对象,然后将其分配给对象变量L;但它将自动完成
我认为这样声明链表类的对象没有任何问题。
int main ()
{
StringLinkedList s1;
s1.addFront("hai");
s1.addFront("dude");
s1.removeFront();
cout<<s1.front();
}