Home c++ Error undefined reference to

Error undefined reference to [duplicate]

Author

Date

Category

I did not divide all in one .cpp by modules, I hope this is not the problem. Added scopes to every variable in functions, in an attempt to fix the problem.
For the most part, the reason itself is interesting why the compiler cannot work, as I understand it, dynamic compilation.

The actual compiler error code:

/ tmp / ccJCiuqE.o: In function `Quote :: ~ Quote () ':
1501.cpp :(. Text._ZN5QuoteD2Ev [_ZN5QuoteD5Ev] + 0xd): undefined reference to `vtable for Quote '
/tmp/ccJCiuqE.o:(.rodata._ZTV16Count_disk_quote [_ZTV16Count_disk_quote ]+0x28): undefined reference to `Quote :: debug () '
/tmp/ccJCiuqE.o:(.rodata._ZTV10Disk_quote [_ZTV10Disk_quote ]+0x28): undefined reference to `Quote :: debug () '
/tmp/ccJCiuqE.o:(.rodata._ZTI10Disk_quote [_ZTI10Disk_quote ]+0x10): undefined reference to `typeinfo for Quote '
collect2: error: ld returned 1 exit status

class Quote

#include & lt; iostream & gt;
  #include & lt; string & gt;
  using namespace std;
  class Quote {
    public:
    Quote () = default;
    Quote (const string & amp; book, double sales_price):
        bookNo (book), price (sales_price) {}
    string isbn () const {return bookNo;}
    virtual double net_price (size_t) const;
    virtual ~ Quote () = default;
    virtual void debug ();
    private:
    std :: string bookNo;
    protected:
    double price = 0.0;
  };

class Disk_quote

class Disk_quote: public Quote {
public:
  Disk_quote () = default;
  Disk_quote (const string & amp; book, double price, size_t qty, double disk):
Quote (book, price), quantity (qty), discount (disk) {}
  double net_price (size_t) const = 0;
protected:
  size_t quantity = 0;
  double discount = 0.0 ;;
};

class Bulk_quote

class Bulk_quote: public Disk_quote {
public:
  Bulk_quote () = default;
  Bulk_quote (const string & amp; book, double price, size_t qty, double disk):
        Disk_quote (book, price, qty, disk) {}
  void debug () final;
  double net_price (size_t) const;
};
double Bulk_quote :: net_price (size_t cnt) const {
    if (cnt & gt; = Disk_quote :: quantity)
      return cnt * (1-Disk_quote :: discount) * Quote :: price;
    else
      return cnt * Quote :: price;
}
void Bulk_quote :: debug () {
  if (quantity & gt; 0 || Bulk_quote :: discount & gt; 0) {
    cout & lt; & lt; Quote :: isbn () & lt; & lt; Quote :: price & lt; & lt; Disk_quote :: quantity & lt; & lt; Disk_quote :: discount & lt; & lt; endl;
  }
  else
    cout & lt; & lt; Quote :: isbn () & lt; & lt; Quote :: price & lt; & lt; endl;
}

cass Count_disk_quote

class Count_disk_quote: public Disk_quote {
public:
  Count_disk_quote () = default;
  Count_disk_quote (const string & amp; book, double price, size_t qty, double disk, size_t max):
        Disk_quote (book, price, qty, disk), max_quantity (max) {}
  double net_price (size_t) const;
private:
  size_t max_quantity = quantity;
};
double Count_disk_quote :: net_price (size_t cnt) const {
  if (cnt & lt; = Count_disk_quote :: max_quantity) {
    if (cnt & gt; = Disk_quote :: quantity)
      return cnt * (1-Disk_quote :: discount) * Quote :: price;
    else
      return cnt * Quote :: price;
  }
  else
return (Count_disk_quote :: max_quantity * (1-Disk_quote :: discount) * Quote :: price)
         + ((cnt - Count_disk_quote :: max_quantity) * Quote :: price);
}
double print_total (ostream & amp; os, const Quote & amp; item, size_t n) {
  double ret = item.net_price (n);
  os & lt; & lt; "ISBN:" & lt; & lt; item.isbn () & lt; & lt; "# sold:" & lt; & lt; n & lt; & lt; "total due:" & lt; & lt; ret & lt; & lt; endl;
  return ret;
}
int main () {
  return 0;
}

Answer 1, authority 100%

As usual, you just don’t have the definitions (bodies) of the two functions –

virtual double net_price (size_t) const;
  virtual void debug ();

in the Quote class.

Since the ABSTRACT class Disk_quote inherits from it, I conclude that you simply forgot to add = 0 to the declarations of these virtual functions and make the class Quote also abstract:

virtual double net_price (size_t) const = 0;
  virtual void debug () = 0;

True, you still have debug () abstract in Count_disk_quote , so you might need to define Quote :: debug () and make it purely virtual Quote :: net_price () . See for yourself how you have it.


Answer 2, authority 50%

The compiler does not see the function definition

virtual void debug ();

declared in class Quote

It looks like the same problem is taking place with another virtual function

virtual double net_price (size_t) const;

Programmers, Start Your Engines!

Why spend time searching for the correct question and then entering your answer when you can find it in a second? That's what CompuTicket is all about! Here you'll find thousands of questions and answers from hundreds of computer languages.

Recent questions