0
votes

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)
1
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.AnT
@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.AnT
How do I define the destructors?Heath Martens
You already defined a destructor for your LinkedList class. And now you are asking how to define destructors?AnT

1 Answers

1
votes

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