【问题标题】:Classes included within main() methodmain() 方法中包含的类
【发布时间】:2013-11-11 11:44:41
【问题描述】:

如果我有类似的代码

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

}

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

问候 直

【问题讨论】:

  • 我正在使用 OpenFoam 中的 multiphaseEulerFoam 求解器,并且在 multiphaseEulerFoam.C 的 main() 中包含类。我假设这些类具有在 main() 中调用的正确结构。
  • 不,这个问题没有回答我的问题。我只想知道 main() 中包含的类是否被执行。
  • 类定义类型。类不执行。它们可以提供其他函数(例如main)可以调用的函数。
  • 所以main()中包含的类里面的方法都被执行了……

标签: c++ class include main


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不,不,不。

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

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

    第三,如果您要学习 C++ 编程,请考虑选择我们的recommended texts 之一。


    你评论了:

    我正在使用 OpenFoam 中的 multiphaseEulerFoam Solver 和 在 multiphaseEulerFoam.C 的 main() 中包含了类。一世 假设类有正确的结构被调用 主要()

    可能是这样,我不怀疑这些类具有从main 调用的正确结构。问题是main 将在#includes 之后出现格式错误,因为您将拥有本地类定义并且谁知道main 中还有什么。

    考虑一下。如果你有一个标题:

    foo.h

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

    然后你尝试将它包含在 main 中:

    main.cpp

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

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

    预处理的 main.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 不会像你想象的那样被“执行”。

    main.cpp 应该如下所示:

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

    【讨论】:

    • 我正在使用 OpenFoam 中的 multiphaseEulerFoam 求解器,并且在 multiphaseEulerFoam.C 的 main() 中包含类。我假设这些类具有在 main() 中调用的正确结构
    • 好的,我现在检查了包含的类/文件,它们中没有类声明。包含的文件中只列出了没有类声明的方法。所以它就像我假设的那样工作。既然你这么清楚地提出了这个论点,我会给你的答案是已解决的标志
    【解决方案3】:

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

    代码在以下情况下执行:

    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,然后调用它。

    【讨论】:

    • #include 只是一个预处理指令。这是否发生在函数中无关紧要。
    • 我正在使用 OpenFoam 中的 multiphaseEulerFoam 求解器,并且在 multiphaseEulerFoam.C 的 main() 中包含类。我假设这些类具有在 main() 中调用的正确结构。
    【解决方案4】:

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

    【讨论】:

    • 我正在使用 OpenFoam 中的 multiphaseEulerFoam 求解器,并且在 multiphaseEulerFoam.C 的 main() 中包含类。我假设这些类具有在 main() 中调用的正确结构。
    • 我查看了 OpenFoam 示例,它们直接在 main.xml 中包含文件。因此,如果是库要求,您没有太多选择,但一般来说,将文件直接包含在某个范围(函数、命名空间、类等)中并不是一个好习惯。
    【解决方案5】:

    #define 和#include 只是在编译的'preprocessing' 阶段发生的文本操作,这在技术上是一个可选阶段。所以你可以以各种方式混合和匹配它们,只要你的预处理器语法正确,它就可以工作。

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

    对于自定义类型,在可能的情况下,最好使用 typedef,因为您仍然可以从编译器的类型检查机制中受益,而且它更不容易出错,因为它比 #define 宏不太可能产生意想不到的副作用周围的代码。

    Jim Blacklers 回答 @#include inside the main () function

    【讨论】:

    • 我正在使用 OpenFoam 中的 multiphaseEulerFoam 求解器,并且在 multiphaseEulerFoam.C 的 main() 中包含了类。我假设这些类具有在 main() 中调用的正确结构。
    【解决方案6】:

    您只包括类的声明。要执行他们的代码,您需要创建类实例(对象)。

    另外,你不应该在函数或类方法中写#include。通常它不会编译。

    【讨论】:

    • "另外,你不能在函数中编写#include。它不会编译。"完全错了
    • @user1233963:不是根据我的经验。也许这取决于包含的文件的内容。但是不能像这样包含常规的类头,这是肯定的。
    • 另一方面,你对它的解释可以是
    • int main( void ) { \n #include "/dev/null" \n } 在gcc 中对我来说编译得很好。
    • @VioletGiraffe 这可能取决于您文件的内容。头文件很可能包含如果此时包含将无法编译的内容,但#include 是一个预处理器指令,并且会盲目地包含该文件。如果它只包含一个有效的 C++ 注释或通用代码,不管你为什么这样做,它都可能编译得很好。
    猜你喜欢
    • 2020-11-15
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多