C ++如果我在main()函数之后放置一个类,那么代码是什么

时间:2013-08-04 18:10:40

标签: c++ class main

我正在观看一些关于C ++的视频教程,我知道你必须在使用或调用之前定义一个函数/类。但我喜欢将main()函数放在顶部,而其他所有函数都放在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;

但它不起作用。

5 个答案:

答案 0 :(得分:5)

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

您的课程必须在首次使用之前进行定义。如果没有在main之前明确说明,通常的方法是创建一个头文件。因此,您使用类声明创建ClassOne.h,并在文件顶部放置#include "ClassOne.h。在这种情况下,类的实际方法通常位于另一个源文件ClassOne.cpp中。

答案 1 :(得分: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();
}

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

答案 2 :(得分:1)

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();
}

答案 3 :(得分:1)

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

我发现这个习惯用法颠倒了main和辅助函数类的顺序。我用来与同事分享小代码,每个人都希望代码的核心(即main)位于最前面,以便他们可以快速编辑它。它当然适用于类和函数(无需声明)。通常我可以留下序言(第一#include s)因为在大多数情况下都包括警卫。

#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

答案 4 :(得分:0)

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