【问题标题】:using 'this' pointer for two constructor对两个构造函数使用“this”指针
【发布时间】:2011-12-28 18:16:34
【问题描述】:

考虑这个类的实现:

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() 采用“this”,实际上是

 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。

我该如何解决这个问题?

【问题讨论】:

    标签: c++ constructor this


    【解决方案1】:

    DcachePort 依赖于iewStage,因此如果要继续使用现有的DcachePort 构造函数实现,则必须传入iewStage 作为第三个构造函数参数。

    (或者编辑现有的构造函数,将fetchStage作为第三个参数传入。)

    或者,重写LSQ::name(),使其使用来自fetchStage 的信息,而不是iewStage。 (如果你不能,那么你仍然需要传入iewStage作为构造函数参数`)


    最后一个建议:如果你能通过"is-a" 测试,你可以继承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 的虚方法。

    【讨论】:

    • 你能粘贴一个sn-p吗?两个构造函数都用this 调用DcachePort,但是port() 无法区分
    • 你怎么可能有两个构造函数,一个初始化iewStage而不是fetchStage,另一个初始化fetchStage而不是iewStage?听起来您需要一个初始化两者的构造函数。
    • @comment2:不一定……我不想尽可能地更改默认代码。所以默认代码初始化自己的参数,我想初始化自己的参数。
    • 每个对象只能执行一个构造函数。您可以从多个替代构造函数中进行选择,但您不能按顺序执行多个构造函数。因此,您必须从任何构造函数调用中初始化所有必须在构造时初始化的参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多