AngelScript - Избегайте запуска неявного конструктора по умолчанию - PullRequest
0 голосов
/ 10 ноября 2018

В настоящее время я тестирую несколько простых вещей 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 года и не с открытым исходным кодом, и мои знания об их реализации очень ограничены, поэтому, если проблема там, я не могу ее изменить.

1 Ответ

0 голосов
/ 28 ноября 2018
  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 не работает, в отличие от других языков.

...