当我从派生类中打印参考成员变量时,它显示错误。但是从主要班级来看,这显示出适当的结果。 请让我知道如何在派生类中获取引用成员。
谢谢
我有以下示例代码:
class sample {
int a;
public:
sample(int a_): a(a_){}
int geta(){ return a; }
};
class base {
protected:
const int& i;
const sample& a;
public:
base(int i_, sample a_):i(i_), a(a_){}
const int& geti(){ return i; };
sample getsample(){ return a; };
virtual void samplefunction() = 0;
};
class derived : public base {
public:
const int& jt;
derived(int i, sample a, int jt_): base(i,a), jt(jt_){}
void samplefunction() {
cout<< "geti from derived. " << geti() << endl;
};
};
int main()
{
sample ob(20);
derived *bob = new derived(50, ob, 2002);
// bob->samplefunction();
cout << "geti from main. " << bob->geti() << endl;
bob->samplefunction();
// cout << "bob inside samplefunction";
return 0;
}
我得到的输出如下: 从主葛蒂。 50 格蒂从派生而来。 13307456
我调用geti的示例函数中的必须打印50,而不是随机值。请给我建议解决方法。
答案 0 :(得分:0)
所以在这段代码中
base(int i_, sample a_):i(i_), a(a_){}
i_
仅存在于base
构造函数中。但是只要存在i
对象,您对它的引用base
就存在。这是根本问题,您的引用存在的时间比其引用的对象存在的时间长。这就是为什么您看到“随机”数字的原因。请注意,a_
和a
存在完全相同的问题。进行此工作的唯一方法是使构造函数的参数也成为引用。像这样
base(const int& i_, sample a_):i(i_), a(a_){}
还有这个
derived(const int& i, sample a, int jt_): base(i,a), jt(jt_){}
和main
int fifty = 50;
sample ob(20);
derived *bob = new derived(fifty, ob, 2002);
现在,您所有的引用都引用fifty
存在的main
。因此,您可以避免此问题。
希望这可以解释问题,但是正如上面的注释中所述,将引用放入类中几乎总是一个坏主意,因为它存在生命周期问题。一般来说,类应获取用于构造它们的对象的副本,如果副本太昂贵,则使用 move构造函数来移动而不是复制。