-2

我正在研究某些类之间具有高多线程的项目,所以我需要访问某个类中的一个值,并且我想使用指针来访问它,所以我所做的基本上如下所述:

我有 3 节课:啊

class A{
public: int myvalue;
}

在 A.cpp 类中

class A{
A::A(){
myvalue=0;
}

function(){
myvalue++;
  }
}

现在我想在一个名为 B 的中间类中访问这个值,因为我可以直接访问它。在 Bh 级

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,所以在类 Ch

class C {
public: B *myptr2;
}

在 C.cpp 类中

class C{
  C::C(){
  myptr2 = new B();
  }

  Function (){
  printf("My value is = %d \n",myptr2->myptrt1->myvalue);
  }
}

当我运行程序时,我的输出不正确。我得到一些等于零的值,而另一些是负值,所以我认为第二个指针指向错误的内存位置?所以我的问题是如何正确访问这个值。为简单起见,我尝试编写类似于我的代码的代码,因为代码太大。

提前感谢您的帮助。

4

1 回答 1

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就不能存在实例B的约束(这也会导致该类C不会对 的存在负责b) :

class C
{
public:
C(B& bRef) : b(bRef) { }
B& b;
于 2013-09-04T16:52:16.807 回答