BoobooSparky
BoobooSparky

Reputation: 31

Undefined reference to vtable issue after reading other posts

After reading past posts about undefined references to vtables, I'm still unsure of why I'm getting an error with mine. I thought I used the proper overrides but I have been unable to get this error to go away. I thought my initial issue might be with overriding or the destructor but the changes I attempted did not seem to fix anything. I'm also getting another undefined reference to one of my functions within my original class. Any advice here would be greatly appreciated.

test.cpp


#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include "CarFactory.hpp"
#include <ctime>
#include <numeric>

using namespace std;

// same function with an STL algorithm
CarFactory *getLeastBusyFactory(const vector<CarFactory*> &inFactories) {

   if (inFactories.size() == 0) return nullptr;

   return accumulate(inFactories.begin()+1, inFactories.end(), *inFactories.begin(),
       [](CarFactory *a, CarFactory *b)
         { return a->getNumCarsInProduction() < b->getNumCarsInProduction() ? a: b; }
       );               
}


int main() {
   vector<CarFactory*> factories;
   
   srand(time(nullptr));

   // Create 3 Ford factories and 
   // 1 Toyota factory with random load. 
   factories.push_back(new FordFactory("Chicago, IL", rand()%4));   
   factories.push_back(new FordFactory("Dearborn, MI", rand()%4));
   factories.push_back(new FordFactory("Louisville, KY", rand()%4));
   factories.push_back(new ToyotaFactory("Lafayette,IN", rand()%4));

   for (size_t i=0; i < 10; ++i) {
      CarFactory *currentFactory = getLeastBusyFactory(factories);
      Car *newCar = currentFactory->requestCar();
      cout << "Ordering " << newCar->getMake()  << " " << newCar->getModel()
       << " from " << currentFactory->getLocation() 
       << endl;
   }
}

CarFactory.hpp //This is called from the test.cpp

#include <string>

// abstract product
class Car{
 public:
   std::string getMake() const {return make_;}
   std::string getModel() const {return model_;}
 protected:
   std::string make_; // this car's make
   std::string model_; // this car's model
};

// two concrete products
class Ford : public Car{
 public:
   Ford();
};

class Toyota : public Car{
 public:
   Toyota();
};

// absract factory
class CarFactory {
public:
   CarFactory(std::string location, int numCarsInProduction):
      location_(location), 
      numCarsInProduction_(numCarsInProduction){}

   Car* requestCar();
   int getNumCarsInProduction() const {return numCarsInProduction_;}
   std::string getLocation() const {return location_;}
   virtual ~CarFactory(){}
protected:
   virtual Car* makeCar() =0;

private:
   int numCarsInProduction_;
   std::string location_;
};

// two concrete factories
class FordFactory : public CarFactory {
public:
   FordFactory(std::string location="", int numCarsInProduction=0):
       CarFactory(location, numCarsInProduction) {}
protected:
   Car* makeCar() override;
};

class ToyotaFactory : public CarFactory {
public:
   ToyotaFactory (std::string location="", 
          int numCarsInProduction=0):
       CarFactory(location, numCarsInProduction){}
protected:
   Car* makeCar() override;
};

Here are the errors I am getting:

C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Jaden\AppData\Local\Temp\ccWdlJfk.o:CarTest.cpp:(.text+0x370): undefined reference to `CarFactory::requestCar()'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Jaden\AppData\Local\Temp\ccWdlJfk.o:CarTest.cpp:(.rdata$.refptr._ZTV13ToyotaFactory[.refptr._ZTV13ToyotaFactory]+0x0): 
undefined reference to `vtable for ToyotaFactory'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Jaden\AppData\Local\Temp\ccWdlJfk.o:CarTest.cpp:(.rdata$.refptr._ZTV11FordFactory[.refptr._ZTV11FordFactory]+0x0): undefined reference to `vtable for FordFactory'
collect2.exe: error: ld returned 1 exit status

Upvotes: 0

Views: 698

Answers (3)

James S
James S

Reputation: 1056

I see you don't have your classes in separate headers and source files. You should put those classes in their own header and source files. Then you should be building without any errors. My first answer assumed this was already done.

Still you need to define those functions as Manuel said in his comment.

Upvotes: 0

James S
James S

Reputation: 1056

If you still get the vtable error after you define those functions, make sure the linker knows about object files associated with the .cpp files.

Upvotes: 0

Manuel
Manuel

Reputation: 2554

You are missing some functions:

Car* CarFactory::requestCar()
{
    return new Toyota(); // something else here, this is just to compile
}

Car* FordFactory::makeCar()
{
    return new Ford();
}

Car* ToyotaFactory::makeCar()
{
    return new Toyota();
}

And Ford& Toyota constructors.

Upvotes: 1

Related Questions