【问题标题】:C++ what to code if i put a class after main() function如果我在 main() 函数之后放置一个类,C++ 编码什么
【发布时间】:2013-08-05 10:35:47
【问题描述】:

我正在观看一些有关 C++ 的视频教程,我知道您必须在使用或调用函数/类之前定义它。但我喜欢将 main() 函数放在顶部,而其他所有东西都放在 main 函数下面。我知道如果我在主函数下面定义一个函数,我必须在使用它之前声明它,但是一个类呢?我需要在主函数上方放置什么才能在主函数下方使用我的类。

#include <iostream>
using namespace std;

int main()
{
    ClassOne one;
    one.coolSaying();
    return 0;
}

class ClassOne
{
    public:
        void coolSaying()
        {
            cout << "Cool stuff yo!" << endl;
        }
};

我尝试通过将它放在 main() 之前来定义我的类:

class ClassOne;

但它不起作用。

【问题讨论】:

  • 你需要把类定义放在main()上面。或者在一个头文件中,包含在main()之前。
  • 我该怎么做?我尝试了 ClassOne;就在 main() 之前
  • 这将是一个前向声明,而不是一个定义。可以声明指针或引用,但不适合实际使用该类的实例。
  • 这是一个声明。您需要将当前拥有的所有内容放在 main 之后,main 之前。

标签: c++ class main


【解决方案1】:

这就是 C++ 中通常使用头文件的原因。当您说ClassOne one 时,编译器需要知道该类的外观以创建该类型的对象。知道类存在于某处是不够的(如果你想要的只是一个指针就足够了)。所以编译器需要已经读取了类的定义。

您的类必须在首次使用之前定义。在main 之前不显式放置,通常的方法是创建一个头文件。所以你用类声明创建ClassOne.h,你的文件顶部有#include "ClassOne.h。在这种情况下,该类的实际方法通常位于另一个源文件ClassOne.cpp

【讨论】:

  • 这是我在学习了更多 C++ 之后最终做的事情 谢谢 :)
【解决方案2】:

当您创建一个类的实例时,它必须是“完整的”。因此,在定义类的全部内容之前,您无法使用该类。

可以这样做:

class ClassOne;
ClassOne* make_class_one();
void use_class(ClassOne *x);

int main()
{
    ClassOne* one = make_class_one();

    use_class(one);
    return 0;
}


class ClassOne
{
    public:
        void coolSaying()
        {
            cout << "Cool stuff yo!" << endl;
        }
};

ClassOne* make_class_one()
{
     return new ClassOne;   // Bad idea, use uniqe_ptr, but I'm lazy.
}

void use_class(ClassOne *x)
{
    x->coolSaying();
}

但总的来说,我们不想这样做。

【讨论】:

    【解决方案3】:

    main() 函数之后的类定义有意义的一种场景:

    #include <iostream>
    using namespace std;
    
    void f();
    
    int main()
    {
        f();
        return 0;
    }
    
    class ClassOne
    {
        public:
            void coolSaying()
            {
                cout << "Cool stuff yo!" << endl;
            }
    };
    
    void f()
    {
        ClassOne one;
        one.coolSaying();
    }
    

    【讨论】:

      【解决方案4】:

      (注意:所有其他答案都是正确的,但您可能会发现这很有用)

      我发现这个习惯用法颠倒了main 和次要函数类的顺序。我曾经与同事分享小代码,每个人都希望代码的核心(即main)位于顶部,以便他们可以快速编辑它。它当然适用于类和函数(无需声明)。通常我可以留下序言(首先是#includes),因为在大多数情况下,这些都包括警卫。

      #include <iostream>
      using namespace std;
      
      #ifdef please_see_definitions_below_main
      int main()
      {
          ClassOne one;
          one.coolSaying();
          return 0;
      }
      #else
      class ClassOne
      {
          public:
              void coolSaying()
              {
                  cout << "Cool stuff yo!" << endl;
              }
      };
      #define please_see_definitions_below_main
      #include __FILE__
      #endif
      

      我使用标签please_see_definitions_below_main,所以它也可以用作评论,但如果你不喜欢它,你可以使用更短的标签,比如AFTER

      【讨论】:

        【解决方案5】:

        在完全定义类型之前,您不能创建类型(变量、值成员)的实际实例,因为它的大小是未知的。没有办法解决这个问题,但是您已经可以使用指向不完整类型的指针来做很多事情。

        【讨论】:

          猜你喜欢
          • 2021-03-29
          • 2012-07-10
          • 2014-02-17
          • 2021-07-15
          • 1970-01-01
          • 1970-01-01
          • 2012-12-05
          • 1970-01-01
          相关资源
          最近更新 更多