'AMA::我的产品':无法实例化抽象类

'AMA::MyProduct': cannot instantiate abstract class

本文关键字:实例化 抽象类 我的 AMA      更新时间:2023-10-16

我正在研究我的学校项目,该项目有一个与其他类别的班级和派生的课程。

product.h

#ifndef AMA_PRODUCT_H
#define AMA_PRODUCT_H
#include <iostream>
#include <fstream>
namespace AMA 
{
    const int max_sku_length = 7;
    const int max_unit_length = 10;
    const int max_name_length = 75;
    const double TRate = 0.13;
    class Product
    {
    private:
        char m_type;
        char m_sku[max_sku_length +1];
        char m_unit[max_unit_length + 1];
        char* m_name;
        int m_Cquantity;
        int m_Nquantity;
        double m_price;
        bool m_status;
    protected:
        void sku(const char* setSku) { strncpy(m_sku, setSku, max_sku_length); }
        const char* name() const { return m_name; }
        bool taxed() const { return m_status; }
        const char* sku() const { return m_sku;}
        void name(const char*);
        const char* unit() const;
        double price() const;
        void message(const char*); 
        bool isClear() const;
    public:
        double cost() const;
        bool operator==(const char* src) { return strcmp(m_sku, src) == 0; }
        bool isEmpty() const { return ((m_sku[0] == '') && (m_name == nullptr) && (m_price == 0) && (m_Cquantity == 0)); }
        int qtyNeeded() const { return m_Nquantity; }
        int quantity() const { return m_Cquantity; }
        int operator+=(int src) { return m_Cquantity += src; }
        Product();
        Product(const char* sku, const char* name, const char* unit, int qty = 0,
            bool taxed = true, double price = 0.0, int qtyNeeded = 0);
        Product(const Product&);
        Product& operator=(const Product&);
        ~Product();
        virtual std::fstream& store(std::fstream& file, bool addNewLine = true)const = 0;
        virtual std::fstream& load(std::fstream& file) = 0;
        virtual std::ostream& write(std::ostream& os, bool linear)const = 0;
        virtual std::istream& read(std::istream& is) = 0;
        double total_cost() const;
        void quantity(int);
        bool operator>(const char*) const;
        bool operator>(const Product&) const;
    };
    std::ostream& operator<<(std::ostream&, const Product&);
    std::istream& operator>>(std::istream&, Product&);
    double operator+=(double&, const Product&);
}
#endif 

myproduct.h

#ifndef AMA_MY_PRODUCT_H
#define AMA_MY_PRODUCT_H
#include <fstream>
#include "Product.h"
#include "ErrorState.h"
namespace AMA {
    class MyProduct : public Product {
    public:
        MyProduct();
        MyProduct(const char* sku, const char* name, const char* unit, int qty = 0,
            bool isTaxed = true, double price = 0.0, int qtyNeeded = 0);
        const char* sku() const;
        const char* name() const;
        const char* unit() const;
        bool taxed() const;
        double price() const;
        double cost() const;
    };
    class Test {
        MyProduct product;   // Error
        const char* filename;
    public:
        Test(const char* file);
        Test(const char* file, const char* theSku, const char* theName);
        std::fstream& store(std::fstream& file, bool addNewLine = true) const;
        std::fstream& load(std::fstream& file);
        std::ostream& write(std::ostream& os, bool linear) const;
        std::istream& read(std::istream& is);
        int operator+=(int value);
        bool operator==(const char* sku) const;
        friend std::ostream& operator<<(std::ostream& os, const Test& test);
        friend double operator+=(double& d, const Test& test);
        friend std::istream& operator>>(std::istream& is, Test& test);
    };
}
#endif

myproduct.cpp

#include <iomanip>
#include <fstream>
#include <cstring>
#include "MyProduct.h"
#ifdef TAB
#undef TAB
#endif
#define TAB 't'
using namespace std;
namespace AMA {
    MyProduct::MyProduct() : Product("", "", "") {}
    MyProduct::MyProduct(const char* sku, const char* name, const char* unit, int qty,
        bool isTaxed, double price, int qtyNeeded) :
        Product(sku, name, unit, qty, isTaxed, price, qtyNeeded) {}
    const char* MyProduct::sku() const { return Product::sku(); }
    const char* MyProduct::name() const { return Product::name(); }
    const char* MyProduct::unit() const { return Product::unit(); }
    bool MyProduct::taxed() const { return Product::taxed(); }
    double MyProduct::price() const { return Product::price(); }
    double MyProduct::cost() const { return Product::cost(); }
    Test::Test(const char* file) : filename(file) { }
    Test::Test(const char* file, const char* theSku, const char* theName) :
        product(theSku, theName, ""), filename(file) { }
    std::fstream& Test::store(std::fstream& file, bool addNewLine) const {
        if (!product.isEmpty()) {
            file.open(filename, ios::out | ios::app);
            file << product.sku() << TAB << product.name() << TAB << product.unit() << TAB <<
                (product.taxed() ? 1 : 0) << TAB << product.price() << TAB << product.quantity() << TAB <<
                product.qtyNeeded() << endl;
            file.clear();
            file.close();
        }
        return file;
    }
    std::fstream& Test::load(std::fstream& file) {
        char sku_[max_sku_length + 1];
        char name[max_name_length + 1];
        char unit[max_unit_length + 1];
        int  quantity, qtyNeeded;
        double price_;
        char taxed_;
        file.open(filename, ios::in);
        file >> sku_;
        file >> name;
        file >> unit;
        file >> taxed_;
        file >> price_;
        file >> quantity;
        file >> qtyNeeded;
        file.clear();
        file.close();
        product = MyProduct(sku_, name, unit, quantity, taxed_ != 0, price_, qtyNeeded);    //ERROR
        return file;
    }
    std::ostream& Test::write(std::ostream& os, bool linear) const {
        return product.isEmpty() ? os : (os << product.sku() << ": " << product.name() << ", quantity: "
            << product.quantity() << ", quantity needed:" << product.qtyNeeded()
            << ", Cost: " << fixed << setprecision(2) << product.cost());
    }
    std::istream& Test::read(std::istream& is) {
        char sku_[max_sku_length + 1];
        char name[max_name_length + 1];
        char unit[max_unit_length + 1];
        int  quantity, qtyNeeded;
        double price_;
        char taxed_;
        cout << " Sku: ";
        is >> sku_;
        cout << " Name (no spaces): ";
        is >> name;
        cout << " Unit: ";
        is >> unit;
        cout << " Taxed? (y/n): ";
        is >> taxed_;
        cout << " Price: ";
        is >> price_;
        cout << " Quantity On hand: ";
        is >> quantity;
        cout << " Quantity Needed: ";
        is >> qtyNeeded;
        product = MyProduct(sku_, name, unit, quantity, taxed_ != 0, price_, qtyNeeded);    //ERROR
        return is;
    }
    int Test::operator+=(int value) {
        product.quantity(product += value);
        return product.quantity();
    }
    bool Test::operator==(const char* sku) const {
        return !std::strcmp(product.sku(), sku);
    }
    std::ostream& operator<<(std::ostream& os, const Test& test) {
        return test.product.write(os, true);
    }
    double operator+=(double& d, const Test& test) {
        return d += test.product.total_cost();
    }
    std::istream& operator>>(std::istream& is, Test& test) {
        return test.product.read(is);
    }
}

我遇到的错误我真的不知道如何解决

不允许抽象类类型" AMA :: myproduct"的对象'ama :: myproduct':无法实例化抽象类不允许抽象类" AMA :: myproduct"的演员

有人可以帮我吗?

错误是自我解释的。

AMA::MyProduct抽象类,因此无法直接实例化。

当它具有至少1个抽象方法( virtual= 0关键字(时,一个类是抽象的。在派生类中必须覆盖一个抽象方法,并且您必须实例化该类别的类,而不是抽象类。

AMA::MyProduct是抽象的,因为它不会覆盖它从AMA::Product继承的4个抽象方法:

virtual std::fstream& store(std::fstream& file, bool addNewLine = true)const = 0;
virtual std::fstream& load(std::fstream& file) = 0;
virtual std::ostream& write(std::ostream& os, bool linear)const = 0;
virtual std::istream& read(std::istream& is) = 0;

您在AMA::Test而不是在AMA::MyProduct中实现它们。