混淆了struct具有相同名称的类

时间:2016-07-19 14:05:18

标签: c++ class struct header

我正在审核一些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 ++的新手,我需要澄清这个疑问。谢谢。

3 个答案:

答案 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.cppclass除了默认成员访问权限(struct私有public类`struct,)之外没有区别。 / p>

这就是为什么您的for实例中有成员b的原因。代码编译和链接正常的原因是因为两个foo s未同时定义。每个翻译单元只定义一个。

答案 2 :(得分:1)

  

为什么在我的main方法中输入foo是结构而不是类?

不是foo中定义的test2.cpp。您包含来自classtest.h的定义,因此main中使用的是定义。

  

它没有在头文件test2.h中定义,怎样才能主访问它?

它没有,它无法访问未包含的定义。

  

第二个问题:给定foo是结构

这个前提是错误的。

  

如何可以访问字段b,结构不存在?

因为,正如我们所得出的那样,fooclasstest.h中定义的那个。

请注意,如果您要将main.cpptest2.cpp中的目标文件链接在一起,则foo会有两个相互矛盾的定义。因此,该计划将违反one definition rule,它将是ill-formed