gpt4 book ai didi

c++ - 我什么时候可以使用前向声明?

转载 作者:太空宇宙 更新时间:2023-11-04 13:55:36 25 4
gpt4 key购买 nike

我正在寻找何时允许在另一个类的头文件中对一个类进行前向声明的定义:

我是否可以对基类、作为成员持有的类、通过引用传递给成员函数的类等执行此操作?

最佳答案

将自己置于编译器的位置:当你前向声明一个类型时,编译器只知道这个类型存在;它对其大小、成员或方法一无所知。这就是为什么它被称为不完整类型。因此,您不能使用类型来声明成员或基类,因为编译器需要知道类型的布局。

假设以下前向声明。

class X;

以下是您可以做什么和不能做什么。

您可以使用不完整的类型做什么:

  • 将成员声明为指针或对不完整类型的引用:

    class Foo {
    X *p;
    X &r;
    };
  • 声明接受/返回不完整类型的函数或方法:

    void f1(X);
    X f2();
  • 定义接受/返回指向不完整类型的指针/引用(但不使用其成员)的函数或方法:

    void f3(X*, X&) {}
    X& f4() {}
    X* f5() {}

不能对不完整的类型做什么:

  • 将其用作基类

    class Foo : X {} // compiler error!
  • 用它来声明一个成员:

    class Foo {
    X m; // compiler error!
    };
  • 定义使用此类型的函数或方法

    void f1(X x) {} // compiler error!
    X f2() {} // compiler error!
  • 使用它的方法或字段,实际上是试图解引用一个类型不完整的变量

    class Foo {
    X *m;
    void method()
    {
    m->someMethod(); // compiler error!
    int i = m->someField; // compiler error!
    }
    };

对于模板,没有绝对的规则:是否可以使用不完整的类型作为模板参数取决于类型在模板中的使用方式。

例如,std::vector<T>要求其参数为完整类型,而boost::container::vector<T>才不是。有时,只有在使用某些成员函数时才需要完整类型; this is the case for std::unique_ptr<T> ,例如。

文档完善的模板应在其文档中指明其参数的所有要求,包括它们是否需要完整类型。

关于c++ - 我什么时候可以使用前向声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com