将派生对象传递给模板

时间:2017-05-12 11:48:38

标签: c++ templates derived-class

我正在为OOP开发一个“糖果店”分配项目,C ++和编译器再次抱怨我的代码:)我在论坛中找到了一个类似的命名主题,但它指出了一些其他问题而不是我......所以,我得到了一个基类来推导一些产品(糖果,饼干,对比)和购物类的模板,如下所示:

class productBase{
protected:
    string name;
    double amount;
    double ppAmount;
public:
    productBase(){}
    productBase(string na, double am, double pp){ 
        name = na; 
        amount = am; 
        ppAmount = pp; 
    }    
    string getName() const;
    double getAmount() const;
    double getppAmount() const;
    //virtual double getCost() const = 0;        // make it abstract ?
};

//  Templete for shopping
template <typename shopType>
class Shop {
private:
    int noi;                        //  number of items
    double totalcost;   
    shopType * sTptr;
public:
    Shop();
    Shop(shopType);
    ~Shop() { delete[] sTptr; }

    void add(shopType &);
    void setDiscount(const double);    
    friend ostream& operator<<(ostream&, const Shop<shopType> &);    
    shopType operator[](int);
};

我的一个产品类是这样的:

class Cookie: public productBase {
private:
    const double taxRate;
public:
    Cookie() :taxRate(8) {}
    Cookie(string nm, double am, double pp) :productBase(nm, am, pp), taxRate(8) {}
    ~Cookie() {}    
    double getCost() const;    
    friend ostream& operator<<(ostream &, Cookie &);    
};

在程序中,我需要将我的产品保存在动态数组中,该数组首先创建并通过添加新实例进行扩展,如下所示:

int main() {
.....
    Cookie cookie1("Chocolate Chip Cookies", 10, 180);  
    Cookie cookie2("Cake Mix Cookies", 16, 210);

    Shop<Cookie> cookieShop(cookie1);       // << this is where I am gettin error
    cookieShop.add(cookie2);
.....

这是我从编译器中得到错误的地方

错误LNK2019未解析的外部符号“public:__thiscall Shop :: Shop(class Cookie)”(?? 0?$ Shop @ VCookie @@@@ QAE @ VCookie @@@ Z)在函数_main <中引用/ em>

我认为它是由我的模板的构造函数引起的,并尝试通过一些例子来修复它,例如通过引用传递和使用基类指针甚至根本不使用基类,但我觉得这个问题是其他东西,如缺少参数或错误的东西,但无法弄清楚:(所以这些是我的模板类的方法,我正在寻找原因......

template<typename shopType>
Shop<shopType>::Shop()
{
    noi = 0;
    totalcost = 0;
    sTptr = NULL;
}

template<typename shopType> 
Shop<shopType>::Shop(shopType sT)           // I guess the problem is here
{
    sTptr = sT;
    noi++;
    totalcost = sT.getCost();       
}

template<typename shopType>
void Shop<shopType>::add(shopType & toAdd)
{
    if (noi == 0) {
        sTptr = new shopType;
        sTptr = toAdd;
        totalcost = toAdd.getCost();
        noi++;
    }
    else {
        shopType * ptr = new shopType[noi + 1];
        for (int a = 0; a < noi; a++) {
            ptr[a] = sTptr[a];
        }    
        delete[] sTptr;         
        sTptr = ptr;
        sTptr[noi++] = toAdd;  
        totalcost += toAdd.getCost();
    }
}

这个模板用法令我困惑;我会在没有使用它的情况下完成,但另一方面我需要学习它:) 那么我失踪的可能是什么呢?

提前感谢您的任何指导或帮助。

0 个答案:

没有答案