C++ 在类中分配和使用公共变量

C++ 在类中分配和使用公共变量,c++,C++,.h文件 #ifndef ABC_H_ #define ABC_H_ class ABC { public: int x; int y; }; #endif .cpp文件 //----- Empty ----------- 主程序.cpp #include <iostream> #include "ABC.h" using namespace std; int main() { ABC a1; a1.x=5; a1.y=2;

.h文件

#ifndef ABC_H_
#define ABC_H_

class ABC
{
  public:
    int x;
    int y;
};
#endif
.cpp文件

//----- Empty  -----------
主程序.cpp

#include <iostream>
#include "ABC.h"
using namespace std;
    int main() {
      ABC a1;
      a1.x=5; a1.y=2;
      cout<<a1.x;
      // ...
    }
所有其他hello world程序等都可以正常编译和运行。我记得当我使用模板在不同的文件中进行定义和实现时,遇到了这个错误(当我在同一个文件中实现了定义和实现时,这个错误就消失了)


我不确定这里出了什么问题。有什么建议吗?

在您发布的代码中,您缺少一个分号:

class ABC
{
public:
int x;
int y;
};
 ^

在您发布的代码中,缺少分号:

class ABC
{
public:
int x;
int y;
};
 ^

您应该确保在
.cpp
文件中包含正确的头文件。您的include路径中可能有另一个
ABC.h
文件。您还可以查看文件系统中的文件命名是否正确(例如
abc.h
abc.h
)。您可以测试头文件是否被包含,并将类型名称修改为唯一的名称,然后查看编译行为是否发生更改

有人向我指出,编译器应该在头文件包含保护中使用约定,这些约定不会与普通源文件冲突。请确保没有任何头文件定义的名称使用双下划线(
\uuu
),或以下划线开头,后跟大写字母


在注释中,您列出了关于在代码行上停止编译的更多信息(没有给出编译停止原因的编译错误),并且添加了关于链接失败的信息。编译器不应该留下部分创建的对象文件,这些文件会导致链接器失败。可能链接器正在查找较旧的对象文件或某种类型的源文件名冲突(例如,
test.c
test.cc
通常都希望保留名为
test.o
的对象文件)。指示编译系统删除所有目标文件(无论是否等效于
makeclean
),然后查看问题是否仍然存在。如果是这样,请检查文件名冲突。

您应该确保在
.cpp
文件中包含正确的头文件。您的include路径中可能有另一个
ABC.h
文件。您还可以查看文件系统中的文件命名是否正确(例如
abc.h
abc.h
)。您可以测试头文件是否被包含,并将类型名称修改为唯一的名称,然后查看编译行为是否发生更改

有人向我指出,编译器应该在头文件包含保护中使用约定,这些约定不会与普通源文件冲突。请确保没有任何头文件定义的名称使用双下划线(
\uuu
),或以下划线开头,后跟大写字母



在注释中,您列出了关于在代码行上停止编译的更多信息(没有给出编译停止原因的编译错误),并且添加了关于链接失败的信息。编译器不应该留下部分创建的对象文件,这些文件会导致链接器失败。可能链接器正在查找较旧的对象文件或某种类型的源文件名冲突(例如,
test.c
test.cc
通常都希望保留名为
test.o
的对象文件)。指示编译系统删除所有目标文件(无论是否等效于
makeclean
),然后查看问题是否仍然存在。如果是,请检查文件名冲突。

@Hans-huh?你读了哪本书?你是否将.h文件包含在你的.cpp文件中?@Hans:这对调试器投诉没有任何影响。@Hans:1)将其声明为
struct
除了更改默认的访问描述符之外没有任何影响。2)
abca1
abca1=ABC()在本例中是相同的。仅供参考:您的代码在我的Debian 6.0.5 x86_64(amd64)机器上编译并运行,未经修改。@Hans-huh?你读了哪本书?你是否将.h文件包含在你的.cpp文件中?@Hans:这对调试器投诉没有任何影响。@Hans:1)将其声明为
struct
除了更改默认的访问描述符之外没有任何影响。2)
abca1
abca1=ABC()在本例中是相同的。仅供参考:您的代码在我的Debian 6.0.5 x86_64(amd64)机器上编译和运行,未经修改。我在这里直接编写时,这是一个打字错误。@user1372448然后确保您发布了一个再现问题的实际代码的最小示例。例如,program.cpp.includes在post中添加了includes文件,这是我在这里直接编写时的一个打字错误。@user1372448然后确保您发布了一个再现问题的实际代码的最小示例。例如,program.cpp.includes在post中添加了includes文件。标准头的预处理器符号是否应以下划线开头,以避免此类冲突?(这只是一个问题。我不知道答案。)注意:
#pragma once
@thb:所有以下划线开头,后跟另一个下划线或大写字母的名称都是为实现保留的(即,您不应该使用它们)。@JerryCoffin:+1。在我的标准副本中,我没有看到任何东西强制使用一个特定的约定,但是我只是做了一个快速的扫描(我的C++标准的副本是9岁)。(2.11)保留给实现以供任何使用。“标准头的预处理器符号是否应该不以下划线开头,以避免这种冲突?(这只是一个问题。我不知道答案。)另请注意:
#pragma