1
votes

I've been working on this for a while now and I can't seem to figure it out. I cannot compile the code as it keeps throwing the below error. Basically what Im trying to do is create a vector which contains objects from both a base and derived class using pointers.

Final Assignment.obj : error LNK2019: unresolved external symbol "public: __thiscall Product::Product(void)" (??0Product@@QAE@XZ) referenced in function "public: __thiscall SaleProduct::SaleProduct(char,class std::basic_string,class std::allocator >,int,double,double)" (??0SaleProduct@@QAE@DV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HNN@Z)
fatal error LNK1120: 1 unresolved externals

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <string>
using namespace std;

class Product
{


public:

Product();
Product(char iT,string des,int inv,double p,double dis)
{
invType = iT;
description = des;
inventory = inv;
price = p;
discount = dis;
}

char getInvType(){
return invType;
}

protected:
char invType ;
string description;
int inventory;
double price;
double discount;
};

class SaleProduct:public Product {

public:



//SaleProduct();
SaleProduct(char iT,string des,int inv,double p,double dis){


}


};



int main()
{
int choice = 0;
// SaleProduct* SaleProductOB;
// Product *productPoint = &ProductOB;
 vector<Product*> inventoryVec;

  char invType;
  string description;
  int inventory;
  double price;
  double discount = 0;




ifstream inFile("Inventory.txt");

if (inFile.is_open()){

while (inFile >> invType >> description >> inventory >> price >>discount){

      if (invType == 'S'){

           inventoryVec.push_back(new SaleProduct(invType,description,inventory,price,discount)  );
     }else{
    //inventoryVec.push_back(new Product(invType,description,inventory,price,discount)  );

      }

}
}else{
cout << "File is not ready!";
}



cout << inventoryVec.size() << endl;


while (choice != 3) {
        cout << "Please enter your choice:" << endl;
        cout << "1. Print available items"  << endl;
        cout << "2. Add item to cart"       << endl;
        cout << "3. Print receipt and quit" << endl << endl;

        cin >> choice;
 }








//system("PAUSE");
return 0;
}
1
If you really want the Product default constructor to be empty, make it so; Product() {}.Joachim Isaksson
Sir, you are a genius! Do you know why a default constructor is needed if I have already specified a constructor?Dre
You don't need one, I think you're trying to call the base class' non default constructor but don't have the syntax there to do it. See Mark's answer below for how to do that and you can remove the default constructor.Joachim Isaksson

1 Answers

2
votes

You may need to specify the correct constructor (as is, it is trying to use the default constructor, which has no actual definition):

SaleProduct(char iT,string des,int inv,double p,double dis) : 
   Product(iT, des, inv, p, dis ){