2016-10-08 67 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{}; 
相關問題