c ++程序无法编译

时间:2013-03-26 16:31:16

标签: c++ compiler-construction

#include <fstream>
#include <vector>
#define maxn 200000
#include <algorithm>

using namespace std;

class automat {
    vector<pair<int, char> > Q[maxn];
    int *validare;
    int *p;
    int init, st_fin, n, m, i, a, b;
    char c;
    public: automat(char*);
    // void operator +=(automat);
};

automat::automat(char *s) {
    ifstream f(s);
    f >> n >> m >> init >> st_fin;
    validare = new int[n];
    p = new int[n];
    for (i = 1; i <= st_fin; i++) {
        f >> p[i];
    }
    for (i = 0; i < m; i++) {
        f >> a >> b >> c;
        Q[a].push_back(make_pair(b, c));
    }
}

int main() {
    automat M("input.txt");
    return 0;
}

它不会编译。你能帮帮我,告诉我为什么吗? 它给我的消息是cc1plus.exe停止工作,我真的不知道为什么。我对OOP有点新意,所以如果你能帮助我,我真的很感激。谢谢!

3 个答案:

答案 0 :(得分:3)

automat M;尝试调用没有参数的构造函数(默认构造函数)。如果您尚未定义自己的构造函数,编译器将仅隐式生成默认构造函数。但是,您已为automat定义了一个带有char*参数的构造函数。您需要传递char*。例如,您可能希望执行以下操作:

char filename[] = "file.txt";
automat M(filename);

这依赖于数组到指针的转换,将filename数组转换为指向其第一个元素的指针。


由于MinGW存在已知问题,编译器崩溃了。原因是你试图在堆栈上分配200000 std::vector s。大多数环境的堆栈限制大约为1MB。您很容易发生堆栈溢出。

答案 1 :(得分:2)

automat没有默认构造函数,因此您无法执行此操作:

automat M;

一旦声明了构造函数,编译器就不再为您生成默认构造函数。你宣布了​​这个:

automat(char*);

因此编译器不再合成automat();您需要决定是否需要默认构造,在这种情况下您需要添加默认构造函数。如果没有,则使用automat实例化char*

答案 2 :(得分:1)

上面指定的程序编译成功但在运行时崩溃并且崩溃不是由于未提供默认构造函数!

编译器尝试创建

时发生崩溃
vector<pair<int, char> > Q[maxn];

原因是这个巨大的最大值

目前定义为

#define maxn 200000

在堆栈上创建这个巨大的向量时发生崩溃,将其更改为更小的值,即200,你不应该看到任何崩溃!或者你需要改变堆栈大小!

我能够在Visual Studio 10上重现它,在VS中我们可以更改http://msdn.microsoft.com/en-us/library/tdkhxaks(v=vs.71).aspx中指定的堆栈大小,同样我们也可以更改为GCC http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt