【问题标题】:In my template class example, “segmentation fault (core dumped)” error occurs在我的模板类示例中,出现“分段错误(核心转储)”错误
【发布时间】:2017-05-19 14:27:15
【问题描述】:

在我的代码中,我想创建一个 cookie 并将其添加到商店,方法是将 cookie 作为参数发送到商店构造函数。它添加了cookie但给出了分段错误错误。

我得到了结果:

  1. 巧克力曲奇 50 180
    分段错误(核心转储)!

我找不到错误的代码部分。你能帮忙吗?

main.cpp:

#include <iostream>
#include <string>
#include "Shop.h"
#include "Cookie.h"
using namespace std;


int main(){
    Cookie cookie1("Chocolate Cookie", 50, 180);
    Cookie cookie2("Cake Mix Cookie", 60, 200);

    Shop<Cookie> cookieShop(cookie1);
    //cookieShop.Add(cookie2);
    cout << cookieShop ;

    return 0;
}

商店.h:

#ifndef SHOP_T
#define SHOP_T
#include <string>
using namespace std;

template<class type>
class Shop;

template<typename type>
ostream& operator<<(ostream& out, const Shop<type>& S){
    for(int i = 0; i < S.size; i++)
        out << i + 1 << ".\t" << S.list[i] << endl;
}

template<class type>
class Shop{
    type *list;
    int size;
public:
    Shop() { list = 0; size = 0; }
    Shop(type t);
    ~Shop(){ delete[] list; }
    void Add(type A);
    friend ostream& operator<< <>(ostream& out, const Shop<type>& S);
};

template<class type>
Shop<type>::Shop(type t) : size(0){
    list = new type();
    list[0] = t;
    size++;
}

template<class type>
void Shop<type>::Add(type A){
    type *temp = new type[size+1];
    for(int i = 0; i < size; i++)
        temp[i] = list[i];
    delete[] list;
    temp[size] = A;
    list = temp;
    size++;
}

#endif

Cookie.h:

#ifndef COOKIE
#define COOKIE
#include <string>
using namespace std;

class Cookie{
    string name;
    int piece;
    float price;
public:
    Cookie(string = "", int = 0, float = 0);
    friend ostream& operator<<(ostream& out, const Cookie& C);
};

#endif

Cookie.cpp:

#include "Cookie.h"
#include <iostream>
#include <string>
using namespace std;

Cookie::Cookie(string n, int pi, float pr){
      name = n;
      piece = pi;
      price = pr;
}

ostream& operator<<(ostream& o, const Cookie& C){
    o << C.name << "\t" << C.piece << "\t" << C.price;
}

【问题讨论】:

  • 这是怎么编译的
  • 是的,编译器警告会立即对您大喊大叫,因为没有从声明为返回值的函数中返回值...
  • @Ðаn:我使用 Dev-C++。我观看了一些有关调试的视频并尝试了我的代码。但它不评估商店 cotr。我不知道是我调试错误还是编译器无法做到这一点。我读过 cotrs 没有被调试。这是真的吗?如果可以,我该怎么做。
  • @Murat 如果你在构造第一个Cookie 时就遇到了段错误,那么显然问题就在那里。那么,为什么您会期望看到调试器到达Shop 构造函数,该构造函数稍后在您的main() 中调用,而它在此之前崩溃并且永远无法到达它?此外,请搜索有关使用 stdlib 容器而不是原始 newdelete 以及使用构造函数初始化列表而不是在 ctor 主体中设置成员变量的信息。哦 - 不使用using namespace std;
  • 当我尝试调试时,我从int main(){ 行开始,然后单击“下一行”,直到出现return 0;。在此之前,它会打印 cookie1 并且不会给出 segfault 错误。如果我继续单击“下一行”,它会回到行Shop&lt;Cookie&gt; cookieShop(cookie1);,然后我再次单击“下一行”按钮,它会给出 seg 错误。我不明白。

标签: c++ template-classes


【解决方案1】:

您忘记在两个operator&lt;&lt; 函数中返回ostream。 这会在链接 &lt;&lt; 操作时导致未定义的行为。

例如它等价于:

o.operator<<(C.name).operator<<("\t")

o.operator&lt;&lt;(C.name) 的返回值未定义,导致下一个 .operator&lt;&lt; 引用无效

【讨论】:

  • @Murat 如果您应用了帖子中给出的建议,并且问题仍然存在(这让我有点惊讶,但是好的),那么它没有回答您的问题,那么您为什么将其标记为答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2012-11-19
相关资源
最近更新 更多