我有这些课程:
class A
{
};
class B : public A
{
public:
B(int val);
private:
int* m_int;
};
B::B(int val)
{
m_int = &val;
}
我这样调用代码,在1函数内部,我知道vars一旦超出范围就会被销毁,但我只需要它们在这个函数中:
{
...
int _int = 0;
B obj(_int);
A *obj2 = &obj;
_int++;
...
}
问题是_int正在变为1,但m_int保持不变。我需要m_int来反映_int中的值,而无需使用代码更新它。我以为有一个指向内存位置的指针会起作用吗?
第二个问题是,当我将鼠标悬停在obj2上时,为了查看obj的值,我收到消息“无法评估孩子”。
答案 0 :(得分:3)
我不太确定以下内容对于新手是否是好建议,但使用这样的引用会起作用:
class B : A
{
public:
explicit B(int& val);
private:
int* m_int;
};
B::B(int& val)
{
m_int = &val;
}
我有点担心这实际上是设计糟糕的表现。如果它只是为了学习目的,请继续前进,理解永远是重要的
答案 1 :(得分:1)
指针m_int
将保持不变,但指向*m_int
的值将发生变化,您还必须通过引用传递值val
这个功能。
编辑:看到您编辑过的问题,因为这是从您可以执行的构造函数中完成的:
class B : A
{
public:
B(int& val) : m_int(val) {}
private:
int& m_int;
};
让m_int
引用相同的变量。
答案 2 :(得分:0)
如果你想改变_int的值你应该传递它的指针,你现在正在做的就是按值调用。
B::B(int* val)
{
m_int = val; // not ref
}
和m_int的类型应为int*
而不是int
对于第二个问题,你将派生类的值存储在指向base的指针中,所以当你试图查看obj2中的内容时,你只能看到类型base的部分,这就是你得到消息的原因,无法评估子项。
Edit--
如果你想看看obj2中究竟是什么,你应该再次将它转换为派生类型。你可能并不总是在运行时知道......