В чем смысл объекта класса внутри его определения class-endclass?

В чем смысл следующего кода (2-я строка), в котором внутри определения класса uvm_resource_pool создается экземпляр (объект) rp?

class uvm_resource_pool;

  static local uvm_resource_pool rp = get();

  // Function: get
  //
  // Returns the singleton handle to the resource pool

  static function uvm_resource_pool get();
    if(rp == null)
      rp = new();
    return rp;
  endfunction

person Karan Shah    schedule 06.12.2014    source источник


Ответы (1)


Вот как кодируется одиночный шаблон в SystemVerilog. Шаблон singleton — это метод ООП, который гарантирует создание только одного экземпляра типа класса. Конструктор, а также объект rp объявляются локальными. Единственный способ получить экземпляр объекта типа класса uvm_resource_pool — это вызвать статический метод get(), который создаст его при первом вызове, а затем в следующий раз просто вернет rp. Это также способ решения фиаско с порядком инициализации статического класса. Вы никогда не ссылаетесь на статическую переменную напрямую, вы всегда используете метод get(), который строит ее по первой ссылке.

person dave_59    schedule 06.12.2014
comment
Да, я понимаю важность статического метода, который гарантирует, что будет создан только первый объект, а затем на этот же объект будет ссылаться позже. Но мой вопрос в том, как объект (uvm_resource_pool rp) может быть создан внутри его собственного определения класса?? - person Karan Shah; 07.12.2014
comment
Значит, при компиляции rp, как компилятор узнает, что содержит uvm_resource_pool, ведь он еще не полностью скомпилировал определение класса? - person Karan Shah; 07.12.2014
comment
Все, что компилятору нужно знать, это то, что uvm_resource_pool является типом, когда вы объявляете rp, и он знает это, потому что компилятор уже видел class uvm_resource_pool. Это работает так же, как и прямое определение типа. Помните, что `rp' - это переменная класса, которая будет содержать ссылку на объект, сама по себе она не является объектом. - person dave_59; 07.12.2014