3

我正在观看一些关于 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;

但它不起作用。

4

5 回答 5

7

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

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

于 2013-08-04T18:15:45.963 回答
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();
}

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

于 2013-08-04T18:33:39.180 回答
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();
}
于 2013-08-04T18:43:23.703 回答
1

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

我发现这个习惯用法是为了颠倒main函数类和次要函数类的顺序。我过去常常与同事分享小代码,每个人都希望代码的核心(即main)位于顶部,以便他们可以快速编辑它。它当然适用于类和函数(无需声明)。通常我可以留下序言(first #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.

于 2013-10-02T07:53:52.607 回答
0

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

于 2013-08-04T18:32:17.733 回答