C ++对象名与类名相同

时间:2012-11-11 16:44:59

标签: c++

我碰巧写了这样的代码:

class a
{
    public:
        a() {}
};


int main()
{
    a *a = new a;        // line 10
    a a;                 // line 11
    return 0;
}

g ++错误输出:

2.c: In function ‘int main()’:
2.c:10:16: error: expected type-specifier before ‘a’
2.c:10:16: error: cannot convert ‘int*’ to ‘a*’ in initialization
2.c:10:16: error: expected ‘,’ or ‘;’ before ‘a’
2.c:11:7: error: expected ‘;’ before ‘a’

我发现,如果我在第10行将“a * a”改为“a * b”,那么g ++很高兴,这是一个很好的代码:

class a
{
    public:
        a() {}
};


int main()
{
    a *b = new a;
    a a;
    return 0;
}

我很困惑,不知道为什么原始代码无法编译以及“修复”如何工作。

有什么想法吗?

4 个答案:

答案 0 :(得分:12)

有关详细信息,请参阅Vaughn's answer。但是,如果您指定要使用而不是变量,则可以解决此问题:

class a
{
    public:
        a() {}
};


int main()
{
    a *a = new class a;
    return 0;
}

int main()
{
    class a a; // although the class word isn't needed here
    return 0;
}

说明

回到C的时代,结构被放在他们自己的命名空间中。在C ++中会发生类似的事情,但是,只要没有本地函数或具有相同名称的变量,类名就可以在其命名空间之外使用。

如果您碰巧对类/结构A和变量/函数A使用相同的名称,则必须使用struct / class关键字,因为编译器将所有后续出现的A解释为变量/函数而不是struct / class。

答案 1 :(得分:5)

只要看到您要声明的变量名称,就可以访问它。

所以在这段代码中:

a *a = new a;
           1

在第1点,a指的是变量a而不是a类。

当你这样做时:

a *b = new a;
a a;

这不是问题,因为b是一个不同的名称。

答案 2 :(得分:1)

G ++找到标识符a并认为你的意思是指针,而不是类名。你的行a *a = new a;与:

相同
a *a;
a = new a;

在第二行中,G ++变得混乱,因为您已经将a定义为指针,而不是类名。

另一行a a;有效,因为它只是一个陈述。

通常一个好主意是让你的班级CamelCase(每个单词的第一个字母是大写)名称,以及实例(变量名称)lower_caselowerCamelCase(有时会被引用)以mixedCase)名称。

答案 3 :(得分:0)

您可以使用typedef暂时为该类型添加别名。

class a;
typedef a _a;
_a a;
void Get(_a a);