【发布时间】: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;复制它,但现在您说您不想在第一个元素的情况下复制它。我很困惑。 -
相信我,我比你更困惑 :) 感谢您的时间和建议。