2

我已经编写了一个模板链接列表,但是当我尝试向其中添加一个对象时,我从节点构造函数中得到错误“C2512 '客户':没有可用的适当的默认构造函数”。

代码:

#pragma once
#include <iostream>
using namespace std;

template <class T>
class node;

template <class T>
class l_list
{

public:
    l_list() { head = tail = NULL; }
    ~l_list();
    void add(T &obj);
    T remove(int ID);
    void print(ostream &out);

private:
    node<T> *head, *tail;
};

template <class T>
class node
{
public:
    template<class> friend class l_list;
    node() {next = NULL;}
private:
    T data;
    node *next;
};

template <class T>
l_list<T>::~l_list()
{
}

template <class T>
void l_list<T>::add(T &obj)
{
    node<T> *ptr = new node<T>;
    ptr -> data = obj;
    ptr -> next = head;
    head = ptr;

    if (tail == NULL) {tail = ptr;}
}

template <class T>
T l_list<T>::remove(int ID)
{
    int i = 0;
    node<T> * ptr = head;

    while (ptr -> data -> id != ID)
    {
        ptr = ptr -> next;
    }
}

template <class T>
void l_list<T>::print(ostream &out)
{
    int i = 0;
    node<T> *ptr = head;
    while ( ptr != NULL )
    {
        out << ptr -> data << endl;
        ptr = ptr -> next;
        i++;
    }
}

以及我尝试放入列表中的对象

l_list<Customer> customers;
Customer bob("Bob", "25 Bob Lane", "01bob82", "M", "bob/bob/bob");
customers.add(bob);

编辑以添加客户:

#pragma once
#include "l_list.h"
#include "Account.h"
#include <string>

using namespace std;

class Customer
{
private:
    l_list<Account> accounts;
    string name;
    string address;
    string telNo;
    string sex;
    string dob;

public:
    Customer(string name, string address, string telNo, string sex, string dob)
    {
        Customer::name = name;
        Customer::address = address;
        Customer::telNo = telNo;
        Customer::sex = sex;
        Customer::dob = dob;
    }

    void createAccount()
    {
        cout << "What type of account?";

    }

    ~Customer()
    {
    }
};
4

3 回答 3

3

这一行:

node<T> *ptr = new node<T>

正在尝试Tnode. 由于没有默认构造函数,所以没有 compiley =P

您可以通过使用复制构造函数(您定义或使用默认构造函数,只要T正确遵守三规则)或定义默认构造函数来解决此问题T。如果我想加强构造访问,我更喜欢前者T

node<T> *ptr = new node<T>(obj);

当然,您需要为node<T>::node(const T&)

class node
{
public:
    template<class> friend class l_list;

    // T-copy-ctor-based constructor
    node(const T& obj) : data(obj), next(NULL) {};

private:
    T data;
    node *next;
};

这是一个缓慢的早晨,如果我把那里搞砸了,很抱歉。=P

于 2012-11-29T19:48:18.867 回答
0

问题出在 void l_list::add(T &obj) 的函数体中,因为如果你使用 node 的默认构造函数,它也会使用成员的默认构造函数,即 T 数据,这显然是没有定义的。不要使用 node 的默认构造函数,而是定义一个 node 构造函数,它接受一个参数 T& obj 并使用引用 obj 初始化成员数据。如果您只使用指向链表中节点的指针,它应该可以工作。

于 2012-11-29T19:48:11.813 回答
0

投诉的原因T data;在您的node班级。当您调用时add,它会尝试构造 a T,即 a CustomerCustomer没有没有参数的构造函数,所以它不起作用。

你可以:

  1. 添加默认构造函数(无参数)
  2. 添加赋值运算符,以便您可以正确分配给data

或者

  • obj将from传递给add构造node函数并正确初始化它。

或者

  • 必须data是一个指针并分配Customer要添加的新对象。
于 2012-11-29T19:49:30.887 回答