问题标签 [local-class]

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 回答
346 浏览

java - Java:使用参数化类型中的局部类作为局部类内部引用的局部变量

我正在用 Java 中的单个方法实现某种算法。该算法需要一个不会在其他任何地方使用的数据结构,因此对我来说使用本地类似乎很合适。算法的最后一步需要遍历方法中之前创建的所有对象,所以我想我会让本地类的构造函数将新创建的对象添加到列表中。在 Java 中,本地类可以访问声明的本地变量final。所以我尝试了这样的事情:

这失败了,因为显然我必须先fooList声明,然后才能在本地类中引用它。好吧,好吧,我想,我将fooList在方法的开头声明:

但这也失败了,因为显然我需要Foo在引用它之前定义类。那么如何打破这种循环依赖呢?

0 投票
1 回答
156 浏览

c++ - 有没有更好的方法在 C++ 中实现类似 Java 的本地类?

在某些情况下,当重载 operator() 不够或需要虚函数或其他东西时,我必须选择本地类而不是 lambda。

嗯..例如:

  1. 我需要一个捕获局部变量的对象,并拥有多个函数,不幸的是,它们具有相同的签名。

    • 如果函数具有不同的签名,则重载 lambda 可以解决此类问题。我认为这是一个常见问题,因为存在 lambda 重载技巧。
  2. 我需要一个捕获局部变量并继承其他类或具有成员变量的对象。

    • 这是 Java 世界每天都会发生的事情。至少在某些时候,动态多态性有它的用处。

我现在正在做的是定义一些像这样的辅助宏:

并将它们放入本地类:

这很丑陋。

我必须引用同一个变量三次。

我必须给这个类起一个ctor的名字。

我必须为闭包提供一个变量名,尽管我认为在当前标准下这无济于事。

至少在 VC++11 中,捕获的 lambda 变量是私有的,所以我不能简单地继承 lambda 类。并且继承 lambda 类,至少在 VC++11 中,需要一个用于 lambda 的变量(或者可能是其他一些用于评估的占位符),这很难看。


而且我想我什至不知道标准是否允许我以这种方式捕获本地类中的局部变量的类型......

在 GCC 4.6 上测试,局部变量的类型不能像在 VC++ 中那样被捕获。并且捕获的变量不会像在 VC++ 中那样公开。哈哈

啊,我的坏。我忘了打开 C++11。这在 G++ 上运行良好。但是 lambda 类型不能被继承,捕获的变量仍然没有暴露。

不太好......必须离开 -fpermissive 。或者 G++ 认为成员变量与 decltype() 中使用的局部变量冲突。


我一直在想为什么 C++ 选择了如此高级的 lambda 来进行闭包,而不是更通用的可以捕获局部变量的局部类。

0 投票
4 回答
1658 浏览

java - Java中是否存在“本地接口”之类的东西?

Java 允许我定义本地抽象类,如下例所示:

出于某种原因,当我尝试定义“本地接口”而不是本地类时,如下所示:

Java 抱怨“成员接口 Bar 只能在顶级类或接口中定义”。是否有一个原因?还是我错过了我犯的错误?

0 投票
2 回答
156 浏览

java - java前向引用在不同情况下的行为是否不同?

请看一下这个片段:

我们可以在定义之前在某个地方访问“Bj”,而在 C 类中访问“final int j”的情况下这是非法的。

java编译器是否将本地类视为简单的变量/对象?特别是,这种行为背后的原因是什么?我的意思是前向检查适用于 Bj,但不适用于 C 类中的“j”。

0 投票
5 回答
4140 浏览

java - 为什么不能在 Java 中创建本地类的实例?

如果我有这个代码。

我无法创建 People 实例。

这是否意味着初始化程序块不能用于定义类?

0 投票
2 回答
463 浏览

c++ - 将本地类函数指针传递给 std::list::sort

我正在尝试使用本地函数对成员变量类型 std::list 进行排序。由于 C++ 不允许本地函数,因此 Herb Sutter 建议使用本地类,因此我最终得到了以下代码。但我不确定如何将函数指针传递给std::list::sort()函数。

我收到编译器错误

模板参数不能引用本地类型

谢谢

0 投票
1 回答
1214 浏览

java - 本地类可以访问 java 8 中的非最终变量

在 Java 8 之前,我们不能在本地类中使用非最终变量。但是现在他们允许最终以及有效的最终(谁的值没有改变),可以由本地类引用。我所知道的(如果我错了,请纠正我),他们不支持引用非最终值,因为可以更改值。那么,他们现在如何支持它以及为什么之前不支持它。

0 投票
1 回答
233 浏览

c++ - 本地类型作为未实例化函数内的模板参数

C++03 中禁止将局部类型作为模板参数:

标准中是否有任何关于在模板未实例化的情况下检查此规则的指令?
是否可以确定,仅在模板实例化尝试(无实例化 => 编译成功)后才检查此规则?

0 投票
3 回答
198 浏览

c++ - 如果在函数模板中声明,本地类是否依赖?

当前的 C++ 编译器(最新的 gcc、clang)需要typename以下示例中的关键字:

如果typename省略 gcc (4.9, 5.0) 会报错:

need 'typename' before 'A<f(T)::C>::Type' because 'A<f(T)::C>' is a dependent scope

根据我对 C++11 标准的阅读,此示例的格式正确。

以下措辞似乎涵盖了此行为:

[温度.dep.type]/8

一个类型是依赖的,如果它是

  • 模板参数,

  • 未知专业的成员,

  • 作为当前实例化成员的嵌套类或枚举,

  • 一个 cv 限定类型,其中 cv 非限定类型是依赖的,

  • 从任何依赖类型构造的复合类型,

  • 由任何依赖类型构造的数组类型,或者其大小由依赖于值的常量表达式指定,

  • 一个 simple-template-id,其中模板名称是模板参数或任何模板参数是依赖类型或依赖于类型或值的表达式,或

  • 由 decltype(expression) 表示,其中 expression 取决于类型。

但是,根据 [class.local],该类C本地类而不是嵌套类。如果是这样,为什么要A<C>被视为依赖?

编辑

对于奖励积分,如果通过添加成员枚举来修改示例C,如下所示:

现在应该A<C>被视为依赖?

0 投票
2 回答
367 浏览

java - 静态上下文中的本地类实例创建表达式

JLS 15.9.2告诉我们如何确定一个封闭实例:让 C 为要实例化的类,让 i 为正在创建的实例。

如果 C 是内部类,则 i 可能有一个立即封闭的实例(第 8.1.3 节),确定如下:

[...]

如果 C 是本地类,则:

  • 如果 C 出现在静态上下文中,则 i 没有立即封闭的实例。

  • 否则,如果类实例创建表达式出现在 静态上下文中,则会发生编译时错误。

  • 否则,令 O 为 C 的直接封闭类。令 n 为整数,使得 O 是出现类实例创建表达式的类的第 n 个词法封闭类型声明。

i 的直接封闭实例是 this 的第 n 个词法封闭实例。

我没明白粗体字是什么意思。让我提供我不应该编译的示例:

演示

那有什么问题?你不能提供一个描述第二点的实际例子吗?