0

I know this question has been asked before but please hummer me. I am having trouble getting a grasp on how to initialize a class.

Here is the code in question.

#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;
}

There error I am interested in is:

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.

I made the change suggested and now I get a different error:

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)
4
  • Now the error is caused by a missing destructor definition for Date class. Where is it? Same issue with Book class and Node class. If you declare destructors, you also have to define them. Commented Oct 8, 2016 at 16:45
  • @Hans Passant: But Date class does not need user-defined copy constructor - it does not manage any non-shallow resources. Just because something is passed by value does not mean it needs a user-defined copy constructor. Quite the opposite, the primary purpose of Rule of Three is actually to encourage designs that work properly with compiler-provided copy semantics. In this case compiler-provided copying is perfectly sufficient for Date class, no need to do anything. Commented Oct 8, 2016 at 17:13
  • How do I define the destructors? Commented Oct 8, 2016 at 17:20
  • You already defined a destructor for your LinkedList class. And now you are asking how to define destructors? Commented Oct 8, 2016 at 17:27

1 Answer 1

1

The following is a function declaration (published, takes 3 ints, returns Date):

Date published(int,int,int)

You wanted to create a variable:

Date published;

or, if you want to show explicitly that you care about zero-intialization:

Date published{};
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.