下面有两个在头文件中使用前向声明的示例:
1。
class SomeClass;
class MainClass
{
SomeClass* NewInstance = nullptr;
}
2。
class MainClass
{
class SomeClass* NewInstance = nullptr;
}
我的问题是,这两个示例之间在性能,编译时间或其他方面是否有所不同?我知道这是一个相当琐碎的情况,但是我对不断使用前向声明的较大环境更感兴趣。
答案 0 :(得分:1)
是的。第一种方法可以多次重用该类声明,第二种方法只能重用一次(除非之前输入“ class”)。接下来,让我们看一下第二种方法:
class MainClass
{
public:
class SomeClass* NewInstance = nullptr;
};
如果要将类的实例传递给类的构造函数,则可能需要执行以下操作:
class MainClass
{
public:
MainClass(class SomeClass* a) { // The compiler think it is like "struct SomeClass* a"
this->NewInstance = a;
}
class SomeClass* NewInstance = nullptr;
};
这意味着您不能通过参数将此类传递给此类。用您的第一种方式,这根本不是问题:
class SomeClass;
class MainClass
{
public:
MainClass(SomeClass* a) {
this->NewInstance = a;
}
SomeClass* NewInstance = nullptr;
SomeClass* aNewInstance = nullptr;
};
编辑:它们之间的另一个区别是某些IDE(例如CLion)会在编写级别警告您它们无法识别以class SomeClass* a
声明的函数或类的变量。例如:
class MainClass
{
public:
class SomeClass* NewInstance = nullptr;
};
class SomeClass {
public:
int a = 5;
int b() {
cout << "aaa" << endl;
}
};
int main() {
MainClass a;
SomeClass b;
a.NewInstance = &b;
a.NewInstance->b(); // class 'SomeClass' doesn't have function 'b'
cout << a.NewInstance->a << endl; // class 'SomeClass' doesn't have field 'a'
return 0;
}
此代码在编译和运行时有效,但是它使代码完全带有关于未声明的函数和变量的错误警报。在前向声明的第一种方式中,这不再是问题-
class SomeClass;
class MainClass
{
public:
SomeClass* NewInstance = nullptr;
};
class SomeClass {
public:
int a = 5;
int b() {
cout << "aaa" << endl;
}
};
int main() {
MainClass a;
SomeClass b;
a.NewInstance = &b;
a.NewInstance->b();
cout << a.NewInstance->a << endl;
return 0;
}