【问题标题】:Can someone correct what I did wrong with my overloading function?有人可以纠正我的重载功能做错了吗?
【发布时间】:2013-05-17 19:27:42
【问题描述】:

我对模板和重载的使用不是很熟悉,我被要求纠正一个代码作为练习。我纠正了我能识别的所有内容,但我不确定我忽略了什么。如果变量名称对您来说听起来很糟糕,我深表歉意,它们都带有原始损坏的代码。

部分错误信息是

CSL.cpp:在成员函数'void CSL::showList() [with T = int]'中:

CSL.cpp:106:从这里实例化 CSL.cpp:26:错误:下标 value 既不是数组也不是指针

代码本身:

template<class T>
CSL<T>::CSL(T *d, int s) : data(*d), size(s)
{
}

template<class T>
void CSL<T>::showList()                 //Function with problem.
{
  cout<<"Comma separated list:"<<endl;
  for(int x = 0; x < size; ++x)
  {
    cout << data[x];
    if(x != size + 1)
      cout << ": ";
  }
  cout << endl << endl;
}

int main()
{

  someCustomers[0].setCustomer("Zaps", 23.55);
  //...
  someCustomers[5].setCustomer("Curtin",56999.19);

  CSL_Size = sizeof(someInts)/sizeof(someInts[0]);
  CSL<int> CSL_Integers(someInts, CSL_Size);
  //...    
  CSL_Size = sizeof(someCustomers)/sizeof(someCustomers[0]);
  CSL<Customer> CSL_Customers(someCustomers, CSL_Size);

  CSL_Integers.showList();   //Problem starts here
  CSL_Doubles.showList();
  CSL_Videos.showList();
  CSL_Customers.showList();

  return 0;
}

【问题讨论】:

  • 如果你去掉了不必要的冗余代码来展示有问题的行为,也许。
  • -1 用于发布代码墙,而不是简化问题的简单说明。如果你不这样做,这意味着我们需要做更多的工作。如果您这样做,我们的工作量会减少,而您的工作量会更大。既然是你的问题,你需要承担大部分的努力。
  • 哎哟。我马上修代码。
  • @DavidHeffernan 我真的很感激你让我知道,而不是其他人只是在没有解决我的错误的情况下进行标记。再次感谢您
  • 已删除不赞成票,感谢您这么好的建议。

标签: c++ templates overloading


【解决方案1】:

您的CLS 类模板接受类型参数T 并定义该类型的数据成员data

当您提供int 作为T 的类型参数时,内部数据成员data 的类型因此为int

在您的showList() 函数中,您尝试将下标运算符应用于int,将另一个整数值作为输入传递给operator []

cout << data[x];

但这是非法的,因为不涉及指针运算(data 不是数组,也不是指针,x 也不是)。这基本上相当于按照这些思路做一些事情:

42[1729]

这显然是无稽之谈。您可能打算将T* 作为data 的类型,并将构造函数重写为:

template<class T>
CSL<T>::CSL(T *d, int s) : data(d), size(s)
//                         ^^^^^^^
//                         Just pass d instead of *d
{
}

但是请注意,将封装容器的所有权留给客户是一个尴尬的设计决策。这样,您必须确保 CSL 对象不会超过数组(否则,data 将是一个悬空指针)。

因此,您的CLS 类应该包含作为构造函数输入提供的数组的副本。为了避免在动态分配、删除数组、三规则、五规则等方面出错,您应该为此使用 RAII 包装器,例如 std::vector

【讨论】:

  • 感谢您的精彩解释。 100% 明白我现在做错了什么!再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多