我正在审核一些c ++代码并遇到一个我不明白的问题。
我有多个cpp文件,main.cpp
包含:
#include <iostream>
#include "classtest.h"
#include "test2.h"
using namespace std;
int main() {
foo test;
test.b=5;
...
查看包含,test2.h
为空,test2.cpp
仅包含此内容:
struct foo{
int a;
};
包含的其他标头,classtest.h
包含:
using namespace std;
class foo{
public:
int a;
int b;
};
正如您所看到的,有一个具有相同名称的类和结构。我的问题是:为什么我的main方法中的foo
类型是结构而不是类?它未在标题test2.h
中定义,main
如何访问它?第二个问题:给定foo
是结构(我使用eclipse并看到它将鼠标光标放在其上),如何可以访问不存在的字段b
结构?
对不起,但我是c ++的新手,我需要澄清这个疑问。谢谢。
答案 0 :(得分:3)
除了foo
之外,如果您手动替换#include <iostream>
,最终会以#include
结尾:
main.cpp
因此,很明显#include <iostream>
using namespace std;
class foo{
public:
int a;
int b;
};
using namespace std;
int main() {
foo test;
test.b=5;
是foo
。这里根本没有什么可疑的东西。
答案 1 :(得分:1)
您看到来自class foo
的{{1}},而不是来自classtest.h
。在C ++中,test2.cpp
和class
除了默认成员访问权限(struct
私有public
类`struct,
)之外没有区别。 / p>
这就是为什么您的for
实例中有成员b
的原因。代码编译和链接正常的原因是因为两个foo
s未同时定义。每个翻译单元只定义一个。
答案 2 :(得分:1)
为什么在我的main方法中输入foo是结构而不是类?
不是foo
中定义的test2.cpp
。您包含来自classtest.h
的定义,因此main
中使用的是定义。
它没有在头文件test2.h中定义,怎样才能主访问它?
它没有,它无法访问未包含的定义。
第二个问题:给定foo是结构
这个前提是错误的。
如何可以访问字段b,结构不存在?
因为,正如我们所得出的那样,foo
是classtest.h
中定义的那个。
请注意,如果您要将main.cpp
和test2.cpp
中的目标文件链接在一起,则foo
会有两个相互矛盾的定义。因此,该计划将违反one definition rule,它将是ill-formed。