Абстрактный класс c ++ (ошибка LNK 2001: неразрешенный внешний символ) - PullRequest
0 голосов
/ 23 сентября 2018

Я получаю эту ошибку, когда создаю объект дочернего класса, который реализует виртуальную функцию базового класса.

ошибка LNK2001: неразрешенный внешний символ "public: virtual void __thiscall CateringOrder :: [Order] :: calcTotals (void)" (? CalcTotals @? QOrder @@ CateringOrder @@ UAEXXZ)

, тогда как мой код

class Order
{
private:
    float SANDWICH_PRICE;
    float TOCOS_PRICE;

public:
    string customerType;
    int NumberOfSandwiches;
    int NumberOfTacos;
    float SandwichSubtotal;
    float Subtotal;
    float TacosSubtotal;
    float Total;
    int TotalItems;

    virtual void calcTotals()=0;

    virtual ~Order(){};



};

// дочерний класс 1

class ConsumerOrder:public Order{
private:
    float SALES_TAX_RATE;
public:
    string CustomerName;
    float SalesTax;
    void calcTotals() override;
    string ToString();

};

// дочерний класс 2

class CateringOrder: public Order
{

public:
    string CustomerCode;
    float DeliveryFee;
    bool PreferredCustomer;
    void Order::calcTotals(void) override;
    string ToString();

};

// другойclass

static class Validation
{
public:
    bool CheckCustomerCode();
    bool CheckCustomerType();
    float CheckDeliveryFee();
    int CheckItem();

};

Теперь, когда я создаю объект базового класса, он показывает ошибку после его компиляции.

bool Validation::CheckCustomerCode()
{
CateringOrder obj;

string tempCode = obj.CustomerCode;

return true;
}

1 Ответ

0 голосов
/ 23 сентября 2018

Что ж, полученная вами ошибка компоновщика подсказывает, что вы никогда не предоставляли определение для

void CateringOrder::calcTotals(void) {…}

Кроме того, что-то вроде этого пишите:

void Order::calcTotals(void) override;

в определении классане является законным C ++.Хотя этот нестандартный синтаксис работает с компилятором Visual C ++, он хранится там только из соображений совместимости.Правильная версия будет просто написать

void calcTotals(void) override;
...