问题标签 [forward-declaration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1883 浏览

objective-c - Cocoa:构建前向声明的类和@interface 可能不存在的警告

我正在尝试在 Leopard 下的项目中构建集群插件。我有以下两个问题。

在项目中,接口类定义为

并且这个类用于使用前向声明的实现类:

然后在一个函数中它被用作:

当我构建这个项目时,它会产生警告:

还产生了另一个警告:

此警告针对以下代码行:

任何人都可以帮助我克服这些警告吗?

0 投票
4 回答
6229 浏览

java - Java:命名空间中类的前向声明

如何在 Java 中进行前向声明?

我有两个类,每个类都需要在另一个类中调用一个方法,它们都位于不同的命名空间中。例如...

更新

在 Eclipse 中,当遇到此代码时,会抛出编译时错误“在构建路径中检测到循环......”。

0 投票
2 回答
3256 浏览

c++ - 前向声明 typedef'd 结构

我不知道如何转发声明一个 Windows 结构。定义是

我真的不想进入这个标题,因为它无处不在。

我试过了

结构上下文

结构 _CONTEXT

没有运气(使用 winnt.h 中的实际结构重新定义基本类型。

0 投票
7 回答
736 浏览

c++ - 当两个类相互引用时编译 C++

我正在尝试围绕连接指针编写一个简单的包装器,当包装器被销毁时,它将把它返回到池中,但它不会编译,因为 ConnectionPool 和 AutoConn 需要相互声明。

我尝试使用前进减速,但没有奏效。我该如何解决这个问题?(使用 g++)

0 投票
6 回答
10259 浏览

c++ - 为什么,真的,删除不完整的类型是未定义的行为?

考虑这个用于解释前向声明不能做什么的经典示例:

我从标准中了解到,由于 Body 的析构函数并非微不足道,因此该案例将走向 UB。我试图理解的是真正的根本原因。

我的意思是,这个问题似乎是由 Handle 的 dtor 是内联的事实“触发”的,因此编译器会执行类似于以下“内联扩展”的操作(这里几乎是伪代码)。

在所有翻译单元(仅Handle_user.cpp在这种情况下)中,Handle 实例都会被销毁,对吧?我只是无法理解:好的,当生成上述内联扩展时,编译器没有 Body 类的完整定义,但是为什么它不能简单地让链接器解析该impl_->~Body()事物,所以让它调用 Body 的析构函数实际在其实现文件中定义的函数?

换句话说:我知道在 Handle 销毁时,编译器甚至不知道 Body 是否存在(非平凡的)析构函数,但是为什么它不能像往常一样做,那就是留下一个“占位符”供链接器填写,如果该功能真的不可用,最终有一个链接器“未解析的外部”?

我在这里错过了什么大事吗(在那种情况下,对不起这个愚蠢的问题)?如果不是这样,我只是想了解这背后的基本原理。

0 投票
6 回答
11812 浏览

c++ - C ++中的任何方式来转发声明函数原型?

我经常使用前向类声明和指向这些类的指针。

我现在需要通过多个层传递函数指针。我宁愿将声明我的函数指针原型的标头仅包含在取消引用函数指针的模块中,而不是包含在简单地传递该指针值的每个层中。

这可能吗?

=====

从回复中我怀疑我没有足够清楚地表达问题。我寻求类似于前向类声明的类比。我们都同意我可以写:

类 foo;

空栏(foo*);

无效 waz(foo* p) { bar(p); }

请注意,除了名称之外,waz 对 foo 类一无所知。也许 bar 可以访问 foo 的完整描述。也许 bar 会简单地将 p 传递得更远。谁在乎?只有那些取消引用 foo* 的网站。所有其他站点只需要“class foo;”。

同样,我知道我可以写:

typedef void foo(int, double);

空栏(foo*);

无效 waz(foo* p) { bar(p); }

不同之处在于,现在标识符 foo 不仅已知表示函数类型,而且还带有完整的签名/原型。这迫使我进入两种不愉快的情况之一:

1)在多个站点克隆 typedef(糟糕!脆弱!) 2)将 typedef 粘贴在标头中,并将其包含在提到 foo* 的任何地方。

注意不对称:在数据对象的情况下,我只需要在我想取消引用 foo* 的那些点提供类 foo 的完整描述;在函数的情况下,我需要在任何我想提到 foo* 的地方提供完整的签名/原型。

那么有没有办法弥补这种不对称性呢?

0 投票
6 回答
35609 浏览

c++ - C++ 嵌套类/前向声明问题

是否可以前向声明嵌套类,然后将其用作外部类的具体(不是指向/引用)数据成员的类型?

IE

0 投票
4 回答
5480 浏览

c++ - 为什么前向声明不适用于类?

我刚刚修改了这里给出的例子。

为什么结构前向声明有效但类前向声明​​无效?

它与命名空间有关tag namespacetypedef namespace?我知道没有 typedef 的结构定义会进入标记命名空间。

结构只是具有所有公共成员的类。所以,我希望他们表现得相似。

0 投票
9 回答
2370 浏览

c++ - 类 foo; 在头文件中

有人能够解释为什么头文件有这样的东西吗?

使用它时是否需要包含语句?

谢谢。

0 投票
3 回答
1511 浏览

c++ - 虚函数的 C++ 前向声明

我有一个类层次结构,我正在其中编写一个虚函数。说有三个班

现在我是否有可能通过做某种前向声明来避免包含C.hin ,说它是 的子类?B.hCA

谢谢,戈库尔。