首页 > 解决方案 > 前向声明语法的差异

问题描述

下面有两个在头文件中使用前向声明的例子:

1.

class SomeClass;

class MainClass
{
    SomeClass* NewInstance = nullptr;
}

2.

class MainClass
{
   class SomeClass* NewInstance = nullptr;
}

我的问题是,这两个示例在性能、编译时间或其他方面是否存在差异?我知道这是一个相当微不足道的情况,但我对不断使用前向声明的更大环境更感兴趣。

标签: c++forward-declaration

解决方案


是的。在您的第一种方式中,您可以多次重用此类声明,而在第二种方式中,您只能执行一次(除非您之前重新输入“类”)。更重要的是,让我们看看你的第二种方式:

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;
}

推荐阅读