【问题标题】:What is the right way of passing an object to a template constructor or method将对象传递给模板构造函数或方法的正确方法是什么
【发布时间】:2017-05-12 22:27:53
【问题描述】:

我有一个 Shop 模板类和一个 Cookie 类,并尝试创建一个 Cookie 类型(或其他类型,因为它是一个模板)的动态数组,并在我的主函数中添加更多内容,如下所示:

template <typename shopType>
class Shop {
private:
    int noi;                 // number of items
    double totalcost;   
    shopType * sTptr;        // for dynamic array
public:
    Shop(shopType &);
    void add(shopType &);
    .....

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

    Shop<Cookie> cookieShop(cookie1);       // getting error here
    cookieShop.add(cookie2);                // and here
.....

使用我写的构造函数和方法:

template<typename shopType>
Shop<shopType>::Shop(shopType & sT)
{
    sTptr = new shopType;
    sTptr = sT;                           // not allowed, how can I fix ?
    noi = 1;
    totalcost = sT.getCost();
}

template<typename shopType>
void Shop<shopType>::add(shopType & toAdd)
{
    if (noi == 0) {
        sTptr = new shopType;
        sTptr = toAdd;                   // not allowed, how can I fix ?
        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();
    }
}

我自然会得到 C2440 '=': cannot convert from 'Cookie' to 'Cookie *' 错误...

我知道我做错了什么,但我不知道如何以正确的方式做...

是否应该创建一个新的 Cookie 指针并将其中的一个 in 参数复制到它会起作用,或者其他什么?有什么建议么 ?提前致谢。

【问题讨论】:

  • 是否要将传递的参数复制到成员变量中?如果是这样,在分配之前首先取消引用指针就足够了:*sTptr = toAdd。甚至更好:sTptr = new shopType (toAdd)。由于您的意图尚不清楚,因此我没有将其发布为答案。此外,请考虑避免在 C++ 中进行手动内存管理,因为它容易出错。考虑将std::unique_ptr 用于指针,而将std::vector 用于可变大小的数组。此外,用delete[] 删除分配给new(而不是new[])的东西是未定义的行为。
  • @Algirdas Preidžius 因为这是学习任务的一部分,所以我不允许使用 STL ... sTptr 旨在指向最后的动态 cookie 数组,这就是我使用 delete 的原因[] ...实际上我不想复制传递的参数,而是试图使其成为 sTptr 指向的动态数组的第一个元素,以便以后可以使用 add 函数添加更多内容
  • new shopType; 不是数组分配。使用delete[] 释放它是未定义的行为。再看一遍,如果您的数组已经包含元素,您可以使用sTptr[noi++] = toAdd; 复制它,但现在您说您不想在第一个元素的情况下复制它。我很困惑。
  • 相信我,我比你更困惑 :) 感谢您的时间和建议。

标签: c++ arrays object


【解决方案1】:

编译器的错误信息非常清楚。您正在尝试将shopType 分配给该行中的shopType*

sTptr = toAdd;

除非您有非常充分的理由自己管理数组的内存,否则请使用std::vector 将对象存储在Shop 中。

template <typename shopType>
class Shop {
   private:
      // There is no need for this.
      // int noi;                 // number of items
      double totalcost;   
      std::vector<shopType> shopItems;

      // ...
};

然后,Shop::add 可以简单地实现为(我将参数类型更改为 const 引用):

template<typename shopType>
void Shop<shopType>::add(shopType const& toAdd)
{
   shopItems.push_back(toAdd);
}

【讨论】:

  • STL 确实可以节省时间,但我打算在不使用 STL 的情况下实现它。无论如何,我已经切换到矢量并按照上面的示例实现了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2012-04-19
  • 1970-01-01
  • 2021-09-09
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多