【问题标题】:confused about struct an class with same name对结构同名的类感到困惑
【发布时间】:2016-11-22 11:38:42
【问题描述】:

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

【问题讨论】:

    标签: c++ class struct header


    【解决方案1】:

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

    不是test2.cpp 中定义的foo。您包含来自classtest.h 的定义,所以这就是main 中使用的内容。

    头文件test2.h中没有定义,main怎么访问?

    它没有,并且它不能访问未包含的定义。

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

    这个前提是错误的。

    如何访问结构体不存在的字段 b?

    因为,正如我们已经得出的结论,foo 是在 classtest.h 中定义的那个。


    请注意,如果您将来自main.cpptest2.cpp 的目标文件链接在一起,则foo 的定义将有两个冲突。因此,该程序将违反one definition rule,它将是ill-formed

    【讨论】:

    • 我认为你的最后一句话指向了正确的方向。如果我理解创建这个项目的可执行文件,我将有两个冲突的 foo 全局定义,导致不可预测的行为。正确的?最后...为什么 eclipse 在 main.cpp 中显示突出显示 foo 的结构定义?这是一个错误还是其他什么?
    • @rok 也许 eclipse 只是随机选择了一个冲突的定义。 eclipse的静态分析器并不完美。
    【解决方案2】:

    除了#include &lt;iostream&gt;,如果你手动替换#includes,你最终会得到main.cpp

    #include <iostream>
    using namespace std;
    class foo{
    public:
        int a;
        int b;
    };
    using namespace std;
    int main() {
    foo test;
    test.b=5;
    

    因此很明显fooclass。这里根本没有任何可疑之处。

    【讨论】:

      【解决方案3】:

      您看到的是来自classtest.hclass foo,而不是来自test2.cpp。在 C++ 中,classstruct 之间没有区别,除了默认成员访问(public 用于 struct,privateforclass`)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-23
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        相关资源
        最近更新 更多