我们可以在C ++中的主程序之后定义struct吗?当我们定义函数时,我们可以在主程序之前声明函数,然后在main函数之后编写函数定义。我想知道在定义结构时是否可以做类似的事情。谢谢。
答案 0 :(得分:4)
我们可以在C ++中的主程序之后定义struct吗?
我认为你的意思是main
功能。是的,我们可以在main
函数之后定义类(包括结构)。演示:
int main(){}
struct S{};
当我们定义函数时,我们可以在主程序之前声明函数,然后在主程序之后编写函数定义。我想知道在定义结构时我们是否可以做类似的事情。
同样适用于类,您可以(转发)在函数之前声明它们,并在之后定义。但是,不完整(声明但未定义)类的使用非常有限。您可以定义指针和对它们的引用,但不能创建它们,也不能调用任何成员函数。演示:
struct S; // (forward) declaration of a class
S* factory(); // (forward) declaration of a function
int main(){
S* s = factory(); // OK, no definition required
// s->foo(); // not OK, S is incomplete
// S s2; // not OK
}
struct S{ // definition of a class
void foo(); // declaration of a member function
};
S* factory() {
static S s; // OK, S is complete
s.foo(); // OK, note how the member function can be called
// before it is defined, just like free functions
return &s;
}
void S::foo() {} // definition of a member function
答案 1 :(得分:3)
编辑:正如评论中提到的@ user2079303,我错误地使用了“前向声明”一词。我相应地更新了我的答案。
如果您只想存储指向该结构的指针,则可以转发声明结构。但是,一旦定义了struct,就只能调用该指针上的方法。
#include <iostream>
// forward declaration of struct
struct S;
// pointer can be defined after forward declaration
S * s;
void workOnSPointer();
int main()
{
workOnSPointer();
}
// definition of struct
struct S
{
S() : bar(42) {}
void foo() { std::cout << "bar is " << bar << "\n"; }
int bar;
};
// methods can only be called after definition
void workOnSPointer()
{
S * s = new S();
s->foo();
delete s;
}
您还可以在结构定义中转发结构的方法,稍后再定义这些方法。
#include <iostream>
// incomplete definition of struct S
// methods of the struct are only declared here
struct S
{
S();
void foo();
int bar;
};
int main()
{
S s;
s.foo();
}
// definition of the struct's methods
S::S() : bar(42) {}
void S::foo() { std::cout << "bar is " << bar << "\n"; }
这个带有前向声明方法的定义是header(.h
)文件的主要用途。您可以在标头中定义结构,并在使用结构的文件中包含标头。您的方法的定义将进入源(.cpp
)文件。应用于上面的代码意味着:
档案S.h
struct S
{
S();
void foo();
int bar;
};
档案S.cpp
#include "S.h"
#include <iostream>
S::S() : bar(42) {}
void S::foo() { std::cout << "bar is " << bar << "\n"; }
档案main.cpp
#include "S.h"
int main()
{
S s;
s.foo();
}
如果您编译S.cpp
和main.cpp
然后链接生成的目标文件,您将获得与开头代码相同的行为。