Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3 TypeError:错误#1007:尝试在非构造函数上实例化_Actionscript 3_Static_Typeerror - Fatal编程技术网

Actionscript 3 AS3 TypeError:错误#1007:尝试在非构造函数上实例化

Actionscript 3 AS3 TypeError:错误#1007:尝试在非构造函数上实例化,actionscript-3,static,typeerror,Actionscript 3,Static,Typeerror,由于某些原因,我无法使其工作(严重简化的代码失败): 它编译,但在首次访问SomeClass时抛出: TypeError: Error #1007: Instantiation attempted on a non-constructor. at com.domain::SomeClass$cinit() ... 您需要生成构造函数并在类中声明变量,而不是在函数中声明变量: package com.domain { public class SomeClass {

由于某些原因,我无法使其工作(严重简化的代码失败):

它编译,但在首次访问
SomeClass
时抛出:

TypeError: Error #1007: Instantiation attempted on a non-constructor.
    at com.domain::SomeClass$cinit()
    ...

您需要生成构造函数并在类中声明变量,而不是在函数中声明变量:

package com.domain { 
    public class SomeClass { 
        private static var helper:Helper 
        public function SomeClass() {
           helper = new Helper(); 
        }
    } 
} 

class Helper { 
} 

我认为它不能在同一个文件中同时使用Helper和SomeClass。 初始化SomeClass时,助手类尚未初始化,因此无法创建助手对象

将Helper移动到一个单独的文件应该可以解决这个问题。

非构造函数错误是编译器用笨拙的方式说“您为我还没有看到的类调用了构造函数”;如果它稍微聪明一点,它可以在抱怨之前检查文件(编译单元)的内部类。。。迈赫

鉴于您已经为静态变量
private
提供了访问权限,显然您只打算在内部使用实例来
SomeClass
(假设;可以作为返回值传递)

以下解决方案将静态变量的创建推迟到内部类初始化时,即调用(可能是隐式的)
Helper.cinit()
时,而不是
SomeClass.cinit()
Helper
尚不存在时:


+1给达伦。另一个选项是将
Helper
类移动到文件的顶部

class Helper {
}

package com.domain {
    public class SomeClass {
        private static var helper:Helper = new Helper();
    }
}

他写道,这个例子是“严重简化的失败代码”。我想他有两个分开的文件。实际上,他们应该在同一个文件中@silyevsk,我认为这确实是一个初始化顺序问题。它必须在同一个文件中,这就是你如何创建一个有趣的。。。这似乎是可行的,尽管这种方法意味着您必须先实例化
SomeClass
,然后才能使用静态成员
helper
。另外,在实例构造函数中初始化静态成员有点奇怪。例如,如果您创建多个
SomeClass
实例,则每次都会重置静态成员。。。不是你想要的。另一个例子是,如果您有一个使用
helper
的静态方法,它会发现它是
null
,直到您至少实例化一次
SomeClass
。至少可以说很奇怪,你不能在构造函数中实例化。因此,您不会每次实例化某个类时都覆盖它,但是当您实例化new Helper()时,您会调用类Helper的构造函数,这就是错误发生的地方。Helper没有构造函数?@Wolv3r:如前所述,您的示例将导致在SomeClass的每个新实例上创建一个新的Helper,这肯定不是静态变量所需要的。同意@Blanka的说法,这非常奇怪,是一个真正的反模式,然而,编译器之所以喜欢它,是因为它在调用构造函数之前有机会初始化
Helper
@Wolv3r,AS3支持隐式定义和无参数构造函数的调用。我不知道您可以这样做。还没有机会测试,但如果它有效,这就是它。这很酷,我也不知道你能做到这一点。也就是说,对于我的特定用例,我仍然不认为它会起作用(我还没有测试它tbh)。。。Flex编译器真的应该在编译任何东西之前解析整个文件
package com.domain {
    public class SomeClass {

        public function doSomething(param:*):void {
            // ... use Helper.INSTANCE
        }

    }
}

class Helper {
    public static const INSTANCE:Helper = new Helper();
}
class Helper {
}

package com.domain {
    public class SomeClass {
        private static var helper:Helper = new Helper();
    }
}