转发声明类指定大小

时间:2017-06-20 09:36:14

标签: c++ forward-declaration

是否可以转发声明一个类,并实际指定其大小,以便在同一个头中我可以在类定义中使用该类?

例如:

 06-20 12:30:42.740    6682-6682/com.example.barbegambino.apslocate E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.barbegambino.apslocate, PID: 6682
    java.lang.NullPointerException
            at com.example.barbegambino.apslocate.fragments.OthersFragment$2.onClick(OthersFragment.java:166)
            at android.view.View.performClick(View.java:4463)
            at android.view.View$PerformClick.run(View.java:18789)
            at android.os.Handler.handleCallback(Handler.java:808)
            at android.os.Handler.dispatchMessage(Handler.java:103)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:5299)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
            at dalvik.system.NativeStart.main(Native Method)

而不是#include“Foo.h”,而不是那样:

class Foo = 3 * sizeof(int);

class Bar
{
    Foo foo;
};

仅供参考:不用担心,我永远不想做这样的事(希望如此),我只是好奇。 请注意,对于前向声明枚举类,上述内容是可能的,这听起来有点类似。

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。

为什么不呢?

请注意,编译器需要完整的类型来实例化一个对象,不仅要知道大小,还要知道必须使用哪些构造函数和析构函数,在您的示例中,如果构造函数或析构函数必须使用,这只会是一个问题为Bar生成。在给定平台上,Foo也可能存在对齐限制。

在您的情况下,编译器可能必须生成默认构造函数和Bar的析构函数。如果Foo碰巧有一个非平凡的构造函数和/或析构函数,默认或显式指定,那么必须在那些构造函数/析构函数中调用它。

注释已经提到过,对于枚举类,完整类型实际上是由前向声明充分指定的:枚举不能有构造函数或析构函数,并且它的大小和对齐限制也可以从基础整数类型中获知。

我认为决定不允许这样做,因为如果类定义可以在不同的文件中传播,确保一致性将使构建过程更复杂并且与C不同。注意C ++可以与“哑”相关联链接器,就像C一样,实际上并不关心类型,只是填写符号的正确地址(我当然简化了一点)。

如果我们可以在一个文件中指定一个类的大小,然后在另一个文件中添加一个成员时忘记更新它,那么不检查一致性会非常危险。它是“一个定义规则”的方式基本上说如果一个类在一个程序中有多个不相同的定义,就会发生任何事情。