前向声明语法的差异
Difference in Forward Declaration Syntax
下面有两个在头文件中使用前向声明的例子:
1.
class SomeClass;
class MainClass
{
SomeClass* NewInstance = nullptr;
}
2.
class MainClass
{
class SomeClass* NewInstance = nullptr;
}
我的问题是,这两个示例在性能、编译时间或其他方面是否存在差异?我知道这是一个相当微不足道的情况,但我对经常使用前向声明的更大环境更感兴趣。
是的。在您的第一种方式中,您可以多次重复使用此 class 声明,而在您的第二种方式中,您只能重复使用一次(除非您之前重新输入 'class' )。不仅如此,让我们看看你的第二种方式:
class MainClass
{
public:
class SomeClass* NewInstance = nullptr;
};
如果您想将此 class 的一个实例传递给 class 的构造函数,您可能想做类似的事情:
class MainClass
{
public:
MainClass(class SomeClass* a) { // The compiler think it is like "struct SomeClass* a"
this->NewInstance = a;
}
class SomeClass* NewInstance = nullptr;
};
这意味着您不能通过参数将此 class 传递给此 class。按照您的第一种方式,这根本不是问题:
class SomeClass;
class MainClass
{
public:
MainClass(SomeClass* a) {
this->NewInstance = a;
}
SomeClass* NewInstance = nullptr;
SomeClass* aNewInstance = nullptr;
};
编辑:它们之间的另一个区别是某些 IDE(例如 CLion)会在写作级别警告您它们无法识别您在 class 中声明的函数或变量 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;
}
下面有两个在头文件中使用前向声明的例子:
1.
class SomeClass;
class MainClass
{
SomeClass* NewInstance = nullptr;
}
2.
class MainClass
{
class SomeClass* NewInstance = nullptr;
}
我的问题是,这两个示例在性能、编译时间或其他方面是否存在差异?我知道这是一个相当微不足道的情况,但我对经常使用前向声明的更大环境更感兴趣。
是的。在您的第一种方式中,您可以多次重复使用此 class 声明,而在您的第二种方式中,您只能重复使用一次(除非您之前重新输入 'class' )。不仅如此,让我们看看你的第二种方式:
class MainClass
{
public:
class SomeClass* NewInstance = nullptr;
};
如果您想将此 class 的一个实例传递给 class 的构造函数,您可能想做类似的事情:
class MainClass
{
public:
MainClass(class SomeClass* a) { // The compiler think it is like "struct SomeClass* a"
this->NewInstance = a;
}
class SomeClass* NewInstance = nullptr;
};
这意味着您不能通过参数将此 class 传递给此 class。按照您的第一种方式,这根本不是问题:
class SomeClass;
class MainClass
{
public:
MainClass(SomeClass* a) {
this->NewInstance = a;
}
SomeClass* NewInstance = nullptr;
SomeClass* aNewInstance = nullptr;
};
编辑:它们之间的另一个区别是某些 IDE(例如 CLion)会在写作级别警告您它们无法识别您在 class 中声明的函数或变量 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;
}