我正在观看一些关于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;
但它不起作用。
答案 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)
在完全定义类型之前,您无法创建该类型的实际实例(变量,值成员),因为其大小未知。没有办法解决这个问题,但是你可以用指向不完整类型的指针做很多事情。