我正在处理某些类之间具有高多线程的项目,所以我需要访问某个类中的值,我想使用指针来访问它,所以我的工作基本上如下所述:
我有3节课: A.h
class A{
public: int myvalue;
}
在A.cpp类
中class A{
A::A(){
myvalue=0;
}
function(){
myvalue++;
}
}
现在我想在名为B的中间类中访问此值,因为我可以直接访问它。在班级B.h
class B{
public: A *myptr1;
}
在班级B.cpp
class B{
B::B(){
myptr1 = new A();
}
Function (){
printf("My value is = %d \n",myptrt1->myvalue);
}
}
当我运行程序时,我的输出是正确的,它等于5.但是,我还需要在第三个类中访问这个值,所以我使用另一个指针来访问它。
我们称之为第三类C,所以在课堂上C.h
class C {
public: B *myptr2;
}
在班级C.cpp
class C{
C::C(){
myptr2 = new B();
}
Function (){
printf("My value is = %d \n",myptr2->myptrt1->myvalue);
}
}
当我运行程序时,我的输出不正确。我得到一些等于零的值,其他值是负值,所以我认为第二个指针指向错误的内存位置?所以我的问题是如何正确访问这个值。为了简单起见,我尝试编写类似于我的代码的代码,因为代码太大了。
提前感谢您的帮助。
答案 0 :(得分:2)
在您发布的简化伪代码中,您正在正确访问myvalue
属性,因为它在A
的构造函数中为零初始化并且之后递增,所以没有理由它的价值应该变成负数。这似乎是由一些重写myvalue
值的错误(隐藏在您的真实代码中)引起的。
但更让我注意的是你有:
class C
{
public:
C() { bPtr = new B(); }
B* bPtr;
现在,如果B
实例中包含的C
实例的生命周期与该C
实例的生命周期相关联,那么bPtr
似乎是合理的}按值汇总〜>即成为具有自动存储持续时间而不是指针的对象:
class C
{
public:
C() { }
B b;
这将减少与使用像这样的裸指针相关的丑陋内存管理。您的代码也不会出错。
或者如果您需要在更多对象之间共享此B
实例,您可能还会考虑设置一个约束,即“C
的实例在没有{的实例的情况下不能存在{1}}“(这也会导致该类B
不对C
}的存在负责:
b