используя указатель this для конструктора - PullRequest
1 голос
/ 28 декабря 2011

Рассмотрим реализацию этого класса:

template <class Impl>
class LSQ {
   public:
      LSQ(O3CPU *cpu_ptr, IEW *iew_ptr);
      IEW *iewStage;
  class DcachePort : public Port
      {
         protected:
           /** Pointer to LSQ. */
           LSQ *lsq;
         public:
           DcachePort(LSQ *_lsq) 
            : Port(_lsq->name() + "-dport", _lsq->cpu), lsq(_lsq)
           { }
   };
   ...
 };

 // default code 
 template <class Impl>
 LSQ<Impl>::LSQ(O3CPU *cpu_ptr, IEW *iew_ptr)  
   :  cpu(cpu_ptr), iewStage(iew_ptr), dcachePort(this), 
 {
   ...
 }

 // default code
 template<class Impl>
 std::string
 LSQ<Impl>::name() const    
 {
    return iewStage->name() + ".lsq";   
 }

Итак, DcachePort() принимает «это», которое на самом деле

 LSQ(O3CPU *cpu_ptr, IEW *iew_ptr);

Теперь я добавил свой собственный конструктор:

 template <class Impl>
 class LSQ {
    public:
       LSQ(O3CPU *cpu_ptr, IEW *iew_ptr);   // default code
       LSQ(O3CPU *cpu_ptr, Fetch *f_ptr);   // added by me
       IEW *iewStage;
       Fetch *fetchStage;
   class DcachePort : public Port
       {
          protected:
            /** Pointer to LSQ. */
            LSQ *lsq;
          public:
            DcachePort(LSQ *_lsq)  // default code
             : Port(_lsq->name() + "-dport", _lsq->cpu), lsq(_lsq)
            { }
   };
   ...
  };


  // added by me
  template <class Impl>
  LSQ<Impl>::LSQ(O3CPU *cpu_ptr, Fetch *f_ptr)   // added by me
   : cpu(cpu_ptr), fetchStage(f_ptr), dcachePort(this)
  {
  }

Проблема в том, что 'this' в моем конструкторе

  LSQ(O3CPU *cpu_ptr, Fetch *f_ptr)

и когда он вводит DcachePort(this), а затем name(), он пытается выполнить

  return iewStage->name() + ".lsq"; 

но в моем конструкторе iewStage не инициализируется. Вместо этого используется fetchStage.

Как я могу это исправить?

1 Ответ

1 голос
/ 28 декабря 2011

DcachePort зависит от iewStage, поэтому, если вы собираетесь продолжать использовать существующую реализацию конструктора DcachePort, вам нужно будет передать iewStage в качестве третьего параметра конструктора.

(Или отредактируйте существующий конструктор, передав ему fetchStage в качестве третьего параметра.)

В качестве альтернативы переписайте LSQ::name(), чтобы он использовал информацию из fetchStage вместо iewStage.(и если вы не можете, то вам все равно придется передать iewStage в качестве параметра конструктора`)


Последнее предложение: если вы можете передать "is-" тест, вы можете создать подкласс LSQ, делая что-то вроде этого (не уверен, что у меня есть правильный синтаксис шаблона):

template <class Impl>
class MyLSQ : public LSQ<Impl>
{
     Fetch *fetchStage;
     MyLSQ(O3CPU *cpu_ptr, IEW *iew_ptr, Fetch *f_ptr);
}


template <class Impl>
MyLSQ<Impl>::MyLSQ(O3CPU *cpu_ptr, IEW *iew_ptr, Fetch *f_ptr)  
  : LSQ(cpu_ptr, iew_ptr), fetchStage(f_ptr)
{
}

Для прохождения теста" is-a ",любой экземпляр MyLSQ должен быть в состоянии использоваться как LSQ для любого из методов LSQ (включая конструктор), но вы можете добавить дополнительное состояние / поведение и переопределить любой из виртуальных методов LSQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...