我在几个弱点之前就开始使用C ++编程,我有一个关于在一个单独的文件中定义一个类文件的问题。这是我的代码。
if (buttons != null) {
for (Button s : buttons) {
layout.removeView(s);
}
}
#include <iostream>
#include "Maths.h"
int main() {
Maths m;
int s = m.sum(1,2);
std::cout << s << std::endl;
return 0;
}
#ifndef Maths_H
#define Maths_H
class Maths
{
public:
int sum(int a, int b);
};
#endif
为什么您不能#include <iostream>
#include "Maths.h"
int Maths::sum(int a, int b)
{
return a + b;
}
与您的班级姓名同名。例如在我的脚本数学?
https://repl.it/repls/UnwillingFreeHeterodontosaurus
答案 0 :(得分:1)
您将#define
称为宏,并且预处理器用某些内容替换宏。
例如,您定义要替换为空的宏Maths
,以及预处理器将执行的操作。定义class Maths { ... }
将替换为class { ... }
。这是无效的。
由于预处理器宏并不存在于任何特定的命名空间中(它们实际上与实际的C ++解析器分开处理),因此它们是全局的。为了避免符号名称中的冲突,宏通常拼写为所有大写字母。在您的情况下,您应该使用MATHS
。
答案 1 :(得分:0)
宏使编译器用定义的值替换文本。所以如果你有这个宏:
#define Math
它将取代所有的&#34;数学&#34;没有任何事情,因为你没有定义一个值来替换它。定义如下:
#define Math 1
将取代所有出现的&#34;数学&#34;值为1。
至于必须包含基类:编译器必须知道在哪里找到基类。如果您不包含包含基类的标头,派生类的标头无法知道从哪里获取基类,因此它将给出Undefined reference to ...
错误。
您还应该将包含警戒放在任何其他代码之上。所以不喜欢这样:
#include "Enemy.h"
#ifndef Ninja_H
#define Ninja_H
//...
#endif
但是像这样:
#ifndef Ninja_H
#define Ninja_H
#include "Enemy.h"
//...
#endif
包含保护基本上是告诉编译器它已经解析了该文件。如果将代码置于防护之外,则可能会导致错误。放置这样的包含将禁用某些优化,这反过来会导致更长的编译时间。简单地说:放置它就没有任何好处。