【问题标题】:Request for member '...' in '...' which is of non-class type. But why? [duplicate]请求非类类型的“...”中的成员“...”。但为什么? [复制]
【发布时间】:2018-03-29 23:15:15
【问题描述】:
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;
}

我在第 64 行的 main 中使用 'ciire' 方法出现错误,我不知道为什么。它说

错误:在“A”中请求成员“citire”,它是非类类型“automat_finit()”。

另外,如果我声明对象 A 而不是 A(),我会得到错误的分配错误。这是为什么呢?

【问题讨论】:

  • 另外,大量链接问题here 也可能是重复目标
  • 对于下一个错误:您输入了CxQ,但随后使用CxFCxSigma 来确定数组大小。这些价值观是什么?

标签: c++


【解决方案1】:

它说“错误:在'A'中请求成员'citire',它是非类类型'automat_finit()'。

这就是它所说的。 automat_finit A() 声明一个函数,而不是一个对象。

如果我声明对象 A 而不是 A()

正确修复。

我得到了错误的分配错误。这是为什么呢?

因为您在某处分配错误。是时候调试了!检查您的分配。检查您的news。检查用于绑定news 的变量。例如,您在哪里给CxF 赋予了有意义的值?

【讨论】:

  • 哦,谢谢。现在,我想问题是那些“新 int”或“新字符”声明之一。
  • @user8113290:是的,我想是的。
【解决方案2】:

automat_finit A(); 声明了一个名为 A 的函数,该函数返回一个 automat_finit 对象。如果你想声明一个名为A 类型为automat_finit 的对象,你需要去掉括号:

automat_finit A;

至于导致的内存分配错误,您的 CxFCxSigma 成员在分别被 F = new int[CxF]Sigma = new char[CxSigma] 语句使用时未初始化。未初始化的类成员具有不确定的值(除非该对象是在全局内存中分配的,而您的情况并非如此)。默认情况下,new 运算符在分配请求的内存量失败时会引发std::bad_alloc 异常。默认情况下,您的成员可能包含非常大的值,您不会覆盖这些值。

【讨论】:

  • 吹毛求疵:不确定,不是随机的。
  • @LightnessRacesinOrbit:已修复,谢谢
猜你喜欢
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
相关资源
最近更新 更多