Cpp在类中定义

时间:2018-01-14 15:44:41

标签: c++

我在几个弱点之前就开始使用C ++编程,我有一个关于在一个单独的文件中定义一个类文件的问题。这是我的代码。

的main.cpp

if (buttons != null) {
    for (Button s : buttons) {
         layout.removeView(s);
    }
}

Maths.h

#include <iostream>
#include "Maths.h"
int main() {
  Maths m;
  int s = m.sum(1,2);
  std::cout << s << std::endl;
  return 0;
}

Maths.cpp

#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

2 个答案:

答案 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

包含保护基本上是告诉编译器它已经解析了该文件。如果将代码置于防护之外,则可能会导致错误。放置这样的包含将禁用某些优化,这反过来会导致更长的编译时间。简单地说:放置它就没有任何好处。