0

我目前正在测试一些简单的 AngelScript 东西,并注意到在如何从类中初始化对象时我发现有些奇怪。

假设我定义了一个这样的类:

class MyClass {
    int i;

    MyClass(int i) {
        this.i = i;
    }
}

我可以通过这样做来创建这个类的一个对象:

MyClass obj = MyClass(5);

但是,我似乎也可以通过这样做来创建一个对象:

MyClass obj;

这里的问题是它obj.i成为一个默认值,因为它是未定义的。此外,向我的类添加一个默认构造函数并在每个类中添加一个 print 函数调用表明,当我这样做时,MyClass obj = MyClass(5);会调用两个构造函数,而不仅仅是具有匹配参数的构造函数。这对我来说似乎很冒险,因为它可能会为这个“幽灵”实例不必要地初始化许多属性。

我可以通过使用句柄来避免这种双重初始化,但这似乎更像是一种解决方法而不是解决方案:

MyClass@ obj = MyClass(5);

所以我的问题总结为:

  1. 我可以要求调用特定的构造函数吗?
  2. 我可以阻止默认构造函数运行吗?
  3. 创建对象时处理所需参数的正确方法是什么?

请注意,这纯粹是使用 AngelScript 脚本语言,与宿主应用程序的 C++ 代码完全分开。主机是 2010 年的,不是开源的,我对其实现的了解非常有限,所以如果问题出在那儿,我无法更改。

4

1 回答 1

1
  1. 为了声明类并将您选择的值发送给构造函数,请尝试: MyClass obj(5);

  2. 为了防止使用默认构造函数,创建它并使用:

.

MyClass()
{
  abort("Trying to create uninitialized object of type that require init parameters");
}

或者

{
  exit(1);
}

或者

{
  assert(1>2,"Trying to create uninitialized object of type that require init parameters");
}

或者

{
  engine.Exit();
}

如果其中任何一个在您的环境中工作。

与其他语言不同,将构造函数声明为私有似乎在 AS 中不起作用。

于 2018-11-28T17:17:20.027 回答