隔了一段时间没写C++代码了,今天凭直觉写了一段代码,结果出了很奇怪的错误,看来基础不够扎实啊!

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
using namespace std;
class A
{
public:
int i;
void f();
};
//错误一
A::f()
{
i=20;
//错误二
cout<<A.i<<endl;
}
int main()
{
A a;
A b;
cout<<a.i<<endl;
a.f();
cout<<123<<endl;
b.f();
}

Error

1
2
3
4
5
6
7
8
9
a.cpp:10:6: error: ISO C++ forbids declaration of ‘f’ with no type [-fpermissive]
A::f()
^
a.cpp:10:1: error: prototype for ‘int A::f()’ does not match any in class ‘A’
A::f()
^
a.cpp:8:7: error: candidate is: void A::f()
void f();
^

Analysis

第一条错误提示:C++禁止没有类型声明的函数f,指的是A::f()
第二条错误提示: 在类A中没有int A::f()函数的原型
第三条错误提示: 可能的候选原型是void A::f()
首先,说一下,当时为什么会写出这样的代码,其实都是一个原因:误把类当成对象
当时自己的思维模式具体是这样的:

1
2
3
4
5
6
class A
{
public:
int i;
void f();
};

认为上面的代码definition(定义)了一个类,其实只是declaration(声明)了一个类. 但是好像f()函数又没有具体的函数体,因此有:

1
2
3
4
A::f()
{
....
}

其实只有在函数前加void就可以解决错误一,因为我们这里是在定义一个函数.
接着使用i,把A当成对象.因此有:

1
A.i

其实是可以直接使用i或A::i来替换A.i就可以解决错误二

Summary

第一:写程序一定要有严格的思维模式
第二:分清楚类的声明和定义
第三:分清楚类和对象的区别(这儿有很多区别,以后碰到了再说)
第四:类使用 :: 获取成员;对象使用 . 获取成员