默认构造函数错误(C ++)

时间:2012-11-29 19:38:17

标签: c++ constructor compiler-errors

我已经编写了一个模板链接列表,但是当我尝试向其添加一个对象时,我从节点构造函数中抛出错误“C2512'Customer':No available default constructor available”。

代码:

#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()
    {
    }
};

3 个答案:

答案 0 :(得分:3)

这一行:

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

尝试在T内默认构建node。由于没有默认构造函数,因此没有compiley = P

您可以使用复制构造函数(您定义或使用默认构造函数,只要T正确符合The Rule of Three)或通过定义{{1}的默认构造函数来解决此问题}。如果我想加强对T

的构造访问,我更喜欢前者
T

当然,您需要为node<T> *ptr = new node<T>(obj);

定义合适的构造函数
node<T>::node(const T&)

一个缓慢的早晨很抱歉,如果我在那里搞砸了什么。 = P

答案 1 :(得分:0)

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

答案 2 :(得分:0)

投诉的原因是T data;课程node。 当您致电add时,它会尝试构建T,即CustomerCustomer没有没有参数的构造函数,所以它不起作用。

你可以:

  1. 添加默认构造函数(无参数)
  2. 添加分配运算符,以便您可以正确分配给data
    • objadd传递到node的构造函数并正确初始化。

    • data成为指针并分配要添加的新Customer个对象。