【发布时间】:2017-05-19 14:27:15
【问题描述】:
在我的代码中,我想创建一个 cookie 并将其添加到商店,方法是将 cookie 作为参数发送到商店构造函数。它添加了cookie但给出了分段错误错误。
我得到了结果:
- 巧克力曲奇 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 容器而不是原始new和delete以及使用构造函数初始化列表而不是在 ctor 主体中设置成员变量的信息。哦 - 不使用using namespace std;。 -
当我尝试调试时,我从
int main(){行开始,然后单击“下一行”,直到出现return 0;。在此之前,它会打印cookie1并且不会给出 segfault 错误。如果我继续单击“下一行”,它会回到行Shop<Cookie> cookieShop(cookie1);,然后我再次单击“下一行”按钮,它会给出 seg 错误。我不明白。
标签: c++ template-classes