2016-10-08 68 views
0

我知道这个问题已经被问过,但请哼我。我无法掌握如何初始化课程。错误:没有匹配的构造函数用于初始化

这里是有问题的代码。

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

//------------------------------------------------------------------- --------------------------- 

class Date                 //Class Date 
{ 
public: 
    int day; 
    int month; 
    int year; 
    Date(); 
    Date(int,int,int); 
    ~Date(void); 
}; 

Date::Date(void) 
{ 
    day = 0; 
    month = 0; 
    year = 0; 
} 

Date::Date(int month, int day, int year) 
{ 
    day = day; 
    month = month; 
    year = year; 
}                   //Class Date 

//--------------------------------------------------------------------------------------------- 
                    //Class Book 
class Book 
{ 
public: 
    string _title; 
    string _author; 
    Date _published; 
    string _publisher; 
    float _price; 
    string _isbn; 
    int _page; 
    int _copies; 
    Book(); 
    Book(string,string,Date,string,float,string,int,int); 
    ~Book(void); 
}; 

Book::Book(void) 
{ 
    _title = ""; 
    _author = ""; 
    //_published; 
    _publisher = ""; 
    _price = 0; 
    _isbn = ""; 
    _page = 0; 
    _copies = 0; 

} 

Book::Book(string title, string author, Date published, string publisher, float price, string isbn, int page, int copies) 
{ 
    _title = title; 
    _author = author; 
    _published = published; 
    _publisher = publisher; 
    _price = price; 
    _isbn = isbn; 
    _page = page; 
    _copies = copies; 
}                   //Class Book 

//--------------------------------------------------------------------------------------------- 

class Node                //Class Node 
{ 
    friend class LinkedList; 
private: 
    Book *_book; 
    Node *_next; 
public: 
    Node(void); 
    Node(Book*); 
    Node(Book*,Node*); 
    ~Node(void); 
}; 

Node::Node(void) 
{ 
    _book = NULL; 
    _next = NULL; 
} 

Node::Node(Book *book) 
{ 
    _book = book; 
    _next = NULL; 
} 

Node::Node(Book *book, Node *next) 
{ 
    _book = book; 
    _next = next; 
}                  //Class Node 

//--------------------------------------------------------------------------------------------- 

class LinkedList              //Class LinkedList 
{ 
private: 
    Node *_head; 
    Node *_tail; 
public: 
    LinkedList(void); 
    LinkedList(Book*); 
    ~LinkedList(void); 
    void insert_front(Book*); 
    void insert_rear(Book*); 
    void print_list(void); 
}; 

LinkedList::LinkedList(void) 
{ 
    _head = NULL; 
    _tail = NULL; 
} 


LinkedList::LinkedList(Book *book) 
{ 
    _head = new Node(book); 
    _tail = _head; 
}                  //Class LinkedList 

//--------------------------------------------------------------------------------------------- 

void LinkedList::insert_front(Book *book) 
{ 
    if(_head == NULL) 
    { 
     _head = new Node(book); 
     _tail = _head; 
    } 
    else 
     _head = new Node(book, _head); 
} 

void LinkedList::insert_rear(Book *book) 
{ 
    if(_head == NULL) 
    { 
     _head = new Node(book); 
     _tail = _head; 
    } 
    else 
    { 
     _tail -> _next = new Node(book); 
     _tail = _tail -> _next; 
    } 
} 

void LinkedList::print_list(void) 
{ 
    Node *temp = _head; 
    while(temp!= NULL) 
    { 
     cout << temp -> _book -> _title << endl; 
     cout << temp -> _book -> _author << endl; 
     cout << temp -> _book -> _publisher << endl; 
     temp = temp -> _next; 
     cout << endl; 
    } 
} 

LinkedList::~LinkedList(void) 
{ 

} 

//--------------------------------------------------------------------------------------------- 
                //Main 
int main(void) 
{ 
    LinkedList myList; 
    ifstream myFile("input.txt"); 

    string title; 
    string author; 
    Date published;   // was "Date published(int,int,int);" 
    string publisher; 
    float price; 
    string isbn; 
    int page; 
    int copies; 

    while(myFile) 
    { 
     getline(myFile,title); 
     getline(myFile,author); 
     //getline(myFile,published); 
     getline(myFile,publisher); 
     //getline(myFile,price); 
     getline(myFile,isbn); 
     //getline(myFile,page); 
     //getline(myFile,copies); 

     myList.insert_front(new  Book(title,author,published,publisher,price,isbn,page,copies)); 
    } 

    myList.print_list(); 

    return 0; 
} 

有错误,我感兴趣的是:

assignment3.cpp:213:33: error: no matching constructor for initialization of 
     'Book' 
    ...Book(title,author,published,publisher,price,isbn,page,copies)); 
    ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
assignment3.cpp:67:7: note: candidate constructor not viable: no known 
     conversion from 'Date (int, int, int)' to 'Date' for 3rd argument 
Book::Book(string title, string author, Date published, string publis... 
    ^
assignment3.cpp:38:7: note: candidate constructor (the implicit copy 
     constructor) not viable: requires 1 argument, but 8 were provided 
class Book 
    ^
assignment3.cpp:54:7: note: candidate constructor not viable: requires 0 
     arguments, but 8 were provided 
Book::Book(void) 
    ^
1 error generated.

我所做的修改建议,现在我得到一个不同的错误:

Undefined symbols for architecture x86_64: 
    "Date::~Date()", referenced from: 
     Book::Book() in assignment3-0f3b1c.o 
     Book::Book(std::__1::basic_string, std::__1::allocator >, std::__1::basic_string, std::__1::allocator >, Date, std::__1::basic_string, std::__1::allocator >, float, std::__1::basic_string, std::__1::allocator >, int, int) in assignment3-0f3b1c.o 
     _main in assignment3-0f3b1c.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation)
+0

现在的错误是由缺少析构函数的定义用于Date类。它在哪里? 'Book'类和'Node'类有同样的问题。如果你声明析构函数,你也必须定义它们。 – AnT

+0

@Hans Passant:但Date类不需要用户定义的拷贝构造函数 - 它不管理任何非浅层资源。仅仅因为某些东西是按值传递的,并不意味着它需要用户定义的拷贝构造函数。恰恰相反,“三规则”的主要目的实际上是鼓励设计与编译器提供的复制语义一起正常工作。在这种情况下,编译器提供的复制对于Date类是完全足够的,不需要做任何事情。 – AnT

+0

如何定义析构函数? –

回答

0

下面是一个函数声明(published ,需要3 int s,返回Date):

Date published(int,int,int) 

你想创建一个变量:

Date published; 

,或者,如果你想明确地表明,你关心零intialization:

Date published{}; 
相关问题