考虑这个类实现:
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
。
我该如何解决?
答案 0 :(得分: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”测试,任何LSLS的方法(包括构造函数)都必须像LSQ一样使用MyLSQ的任何实例,但是你可以添加额外的状态/行为,并覆盖任何LSQ的虚拟方法。