我正在尝试将一个对象添加到我的链表中,问题是我不确定它的self是一个带有子类的基类。车辆和汽车,范。分别。
该计划的想法是一种车辆租赁系统,用户可以将车辆添加到系统并设置车辆的某些变量,例如:注册编号引擎大小等,但如果车辆是面包车或车辆你设置进一步的变量取决于它是汽车还是面包车。
例如,如果我想添加一辆福特Van,我会输入引擎大小,型号等细节,然后我会指定它的面包车允许我添加van子类中包含的更多细节。
如果您有任何人可以帮助我将对象添加到链接列表中以使其符合标准,我将非常感激。
我要插入新节点的代码。
void linkedList::InsertNode(int regNo,double engine,string model,vehicle_type make)
{
Vehicle<int> vehicle(int,double,string,vehicle_type);
//create new node
nodePtr n=new node;
//make next point to null
n->next=NULL;
n->data=vehicle(regNo,engine,model,make);
//if we have a list set current pointer
if(head!=NULL)
{
current=head;
//checks if end
while(current->next!=NULL)
{
current=current->next;
}
//connect last node to new node
current->next=n;
}
else
{
//new node is front of list if empty
head=n;
}
}
Linkedlist.h
#pragma once
#include <string>
using namespace std;
class linkedList
{
template<class regNo>;
friend class Vehicle<int>;
typedef enum{ Car,Van} vehicle_type;
private:
typedef struct node
{
int data;
node* next;
}*nodePtr;
nodePtr head;
nodePtr current;
nodePtr temp;
public:
linkedList();
void InsertNode(int regNo ,double engine,string model,vehicle_type make);
void SearchNode(int);
void PrintList();
void DeleteNode(int delData);
~linkedList();
};
vehicle.h
#pragma once
template<class regNo=int>
class Vehicle
{
public:
typedef enum{ Car,Van} vehicle_type;
protected:
vehicle_type make;
string model;
int regNo;
double engineSize;
bool rented;
public:
Vehicle(vehicle_type make):model(""),regNo(reg),engineSize(engine),make(make),rented(false){};
char getMakeModel();
int getRegNo();
int getEngineSize();
bool getRented();
bool setRented(bool rented);
~Vehicle();
void listVehicle();
void addVehicle();
void removeVehicle(int delData);
void bookVehicle();
void displayDetails(int regNo);
void listCarsNotRented();
void listFiveDoor();
void listFordVansRented();
};
为了澄清,列出的链接将包含许多保存车辆信息的对象列表,我需要做的是将车辆(对象)添加到列表中。
尝试将节点内的数据设置为我想要的对象时发生错误。
答案 0 :(得分:0)
首先,我不知道这将如何运作:
Vehicle<int> vehicle(int,double,string,vehicle_type);
我认为你打算输入这个:
Vehicle<int> vehicle(regNo,engine,model,vehicle_type);
如果您没有链接列表的作业或其他内容,您必须自己实现链接列表,我建议您使用Boost链接列表而不是实现自己的列表:Link
对于实际问题本身:
如果要查找要添加到链接列表的对象类型,只需覆盖它们的方法以支持子类。因此,不是通过使用基元(int,double等)添加到链表,而是使用Vehicle对象或Van对象来添加到列表中。我不知道代码,但它是这样的:
void linkedList::InsertNode(Van *pVan)
{
Van newVan(*pVan); // You need a copy constructor for this
// Set Van specific attributes like this:
newVan->setEngineSize (123);
//create new node
nodePtr n = new node;
//make next point to null
n->next=NULL;
n->data= newVan; // You need a copy constructor for this
//if we have a list set current pointer
if(head!=NULL)
{
current=head;
//checks if end
while(current->next!=NULL)
{
current=current->next;
}
//connect last node to new node
current->next=n;
} else
{
//new node is front of list if empty
head=n;
}
}
void linkedList::InsertNode(Car *pCar)
{
Car newCar(*pCar); // You need a copy constructor for this
// Set Car specific attributes like this:
newCar->setEngineSize (123);
//create new node
nodePtr n = new node;
//make next point to null
n->next=NULL;
n->data= newCar; // You need a copy constructor for this
//if we have a list set current pointer
if(head!=NULL)
{
current=head;
//checks if end
while(current->next!=NULL)
{
current=current->next;
}
//connect last node to new node
current->next=n;
} else
{
//new node is front of list if empty
head=n;
}
}
因此覆盖方法以支持不同的类。编译代码时,它会自动为您调用正确的方法。例如,如果你有一个Van并调用insertNode函数来传递新Van对象的引用,它将不会调用void linkedList::InsertNode(Vehicle *pVehicle)
但会调用void linkedList::InsertNode(Van *pVan)
我的建议: - 创建一个指向列表末尾的“尾部”指针,这样每次添加对象时都不会经历while循环。 - 在实现任何其他容器时,请使用“模板”作为数据类型。