这个问题在这里已有答案:
class automat_finit
{
int CxQ, CxF, CxSigma, CxTranzitii, q0, SC, *F;
char *Sigma;
struct delta
{
int a1, a2;
char c;
}*G;
public:
int tranzitie(int x, char c)
{
for(int i = 0; i < CxTranzitii; i++)
if((G[i].a1 == x) && (G[i].c == c))
return G[i].a2;
return -1;
}
automat_finit()
{
ifstream f("automatfinit.in");
SC = 0;
f >> CxQ;
F = new int[CxF];
for(int i = 0; i < CxF; i++)
f >> F[i];
Sigma = new char[CxSigma];
for(int i = 0; i < CxSigma; i++)
f >> Sigma[i];
f >> CxTranzitii;
G = new delta[CxTranzitii];
for(int i = 0; i < CxTranzitii; i++)
f >> G[i].a1 >> G[i].c >> G[i].a2;
f.close();
}
bool citire(char *cuvant)
{
int l = strlen(cuvant);
for(int i = 0; i < l; i++)
{
SC = tranzitie(SC, cuvant[i]);
if(SC == -1) return false;
}
for(int i = 0; i < CxF; i++)
if(SC == F[i]) return true;
return false;
}
};
int main()
{
automat_finit A();
char w[100];
cin>>w;
if(A.citire(w) == true) cout<<"Word accepted"<<endl;
else cout<<"Word denied"<<endl;
}
我使用'citire'方法在第64行的 main
中收到错误,我不知道为什么 . 它说
错误:请求'A'中的成员'citire',这是非类型'automat_finit()' .
此外,如果我声明对象 A
而不是 A()
,我得到错误的alloc错误 . 这是为什么?
2 回答
这就是它所说的 .
automat_finit A()
声明一个函数,而不是一个对象 .正确修复 .
因为你在某个地方分配不好 . 是时候调试了!检查您的分配 . 检查你的
new
. 检查用于绑定new
的变量 . 例如,你在哪里给了CxF
一个有意义的值?automat_finit A();
声明一个名为A
的函数,该函数返回automat_finit
对象 . 如果要声明名为A
的automat_finit
类型的对象,则需要删除该子句:至于产生的内存分配错误,
CxF
和CxSigma
成员在F = new int[CxF]
和Sigma = new char[CxSigma]
语句分别使用时未初始化 . 未初始化的类成员具有不确定的值(除非在全局内存中分配对象,在您的情况下不是这种情况) . 默认情况下,new
运算符在无法分配请求的内存量时会抛出std::bad_alloc
异常 . 默认情况下,您的成员可能包含非常大的值,您不会覆盖这些值 .