main() 方法中包含的类



如果我有一些代码,比如

    main(int argc, char *argv[])
{
...
#include "Class1.H"
#include "Class2.H"
...
}

通常,main() 方法是每个应用程序的起点,并且要执行 main() 中的内容。我假设 main() 中包含的所有类的内容将在启动 main() 时执行,我是否正确?

问候斯特莱特

不,不,

首先,您不会在函数中#include文件。 在文件开头、其他声明之前#include文件。 好的,你可以在任何地方使用#include,但你真的不应该。

其次,#include执行任何内容。 它基本上只是一个复制粘贴操作。 #include d文件的内容(有效地)准确地插入到您放置#include的位置。

第三,如果你要学习用C++编程,请考虑选择我们推荐的文本之一。


你评论说:

我正在使用OpenFoam中的多相欧拉泡沫求解器,并且 在多相欧拉泡沫.C 的 main() 中包含了类。我 假设类具有要调用的正确结构 主()

可能是这种情况,我不怀疑这些类具有从main调用的正确结构。 问题是main#include之后会格式不正确,因为您将拥有本地类定义,谁知道main中还有什么。

考虑一下。 如果您有标头:

福.H

#ifndef FOO_H
#define FOO_H
class Foo
{
public:
  Foo (const std::string& val)
  :
    mVal (val)
  {
  }
private:
  std::string mVal;
};
#endif

你试着把它包含在主要:

主.cpp

int main()
{
  #include "foo.h"
}

预处理 #include 指令后,编译器将尝试编译的结果文件将如下所示:

预处理的主.cpp

int main()
{
    #ifndef FOO_H
    #define FOO_H
    class Foo
    {
    public:
      Foo (const std::string& val)
      :
        mVal (val)
      {
      }
    private:
      std::string mVal;
    };
    #endif
}

这是各种错误。第一,你不能像这样声明本地类。 第二,Foo不会像你假设的那样被"执行"。

主.cpp 应如下所示:

#include "foo.h"
int main()
{
}

#define#include只是在编译的'preprocessing'阶段(技术上是一个可选阶段)发生的文本操作。因此,您可以通过各种方式混合和匹配它们,只要您的预处理器语法正确,它就会起作用。

但是,如果您确实使用#undef重新定义宏,则代码将难以理解,因为相同的文本在代码的不同位置可能具有不同的含义。

对于自定义类型,typedef 在可能的情况下更受欢迎,因为您仍然可以从编译器的类型检查机制中受益,并且它不太容易出错,因为它比#define宏对周围代码产生意外副作用的可能性要小得多。

吉姆·布莱克勒斯 在主()函数内回答@#include

尽量避免这样的代码。 #include指令将文件的内容插入其位置。您可以通过在 main 函数中复制粘贴来自 Class1.H 和 Class2.H 的文件内容来模拟代码的结果。

包含不属于任何函数或类方法体,这不是一个好主意。除非在头文件中实例化其中一个类,否则不会执行任何代码。

在以下情况下执行代码:

  1. 类被实例化,然后调用它的构造函数方法并执行方法中的代码。
  2. 如果实例化类中有类类型的变量,它们也将运行其构造函数。
  3. 调用类方法时。

试试这个例子:

#include <iostream>
using namespace std;
int main()
{
    class A
    { public:
        A() { cout << "A constructor called" << endl; }
    };
    // A has no instances
    class B
    { public:
        B() { cout << "B constructor called" << endl; }
        void test() { cout << "B test called" << endl; }
    } bbb;
    // bbb will be new class instance of B
    bbb.test(); // example call of test method of bbb instance
    B ccc;      // another class instance of B
    ccc.test(); // another call, this time of ccc instance
}

当您运行它时,您会观察到:

  1. 不会创建类 A 的实例。A类不会运行任何内容。
  2. 如果您初始化 BBB 和 CCC,它们的构造函数将被运行。要运行任何其他代码,您必须首先创建一个方法,例如test然后调用它。

这是一个 openFoam 语法,他说 open Foam 对待#include就像调用函数一样是正确的。 在OpenFoam中,使用#include Foo.H将运行代码,而不是在不同的层次结构级别中完成的类声明。我建议不要在C++论坛上提出所有与openFoam相关的问题,因为在openFoam中有很多东西内置C++,需要打破规则才能生成工作代码。

你只包含类的声明。要执行其代码,您需要创建类实例(对象)。

此外,不应在函数或类方法中编写#include。通常情况下,它不会编译。

相关内容

  • 没有找到相关文章

最新更新