Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问指向另一个指向值的类指针的类指针_C++_Pointers_Indexoutofboundsexception - Fatal编程技术网

C++ 如何访问指向另一个指向值的类指针的类指针

C++ 如何访问指向另一个指向值的类指针的类指针,c++,pointers,indexoutofboundsexception,C++,Pointers,Indexoutofboundsexception,我正在从事一个在某些类之间具有高多线程的项目,因此我需要访问某个类中的值,并且我想使用指针来访问它,因此我所做的基本描述如下: 我有三门课: A.h 在A班 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

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

我有三门课: A.h

在A班

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);
  }
}
当我运行程序时,我的输出不正确。我得到了一些等于零的值,还有一些是负值,所以我认为第二个指针指向了错误的内存位置?所以我的问题是如何正确地访问这个值。为了简单起见,我尝试编写与我的代码类似的代码,因为代码太大了


提前感谢您的帮助。

在您发布的简化伪代码中,您正确地访问了
myvalue
属性,由于它在
A
的构造函数中初始化为零,并且随后递增,因此它的值没有理由变为负值。这似乎是由于某些错误(隐藏在真实代码中)重写了
myvalue
的值造成的

但更吸引我注意的是你有:

class C
{
public:
C() { bPtr = new B(); }
B* bPtr;
现在,如果
C
实例中包含的
B
实例的生存期与
C
实例的生存期相关联,那么
bPtr
按值聚合似乎是合理的,即,它是一个具有自动存储持续时间的对象,而不是一个指针:

class C
{
public:
C() { }
B b;
这将减少与使用这些裸指针相关的丑陋的内存管理。您的代码也不会那么容易出错

或者如果需要在多个对象之间共享<代码> b/COD>的实例,您也可以考虑设置一个约束,即“没有代码< C >代码>的实例如果没有<代码> b/COD>的实例就不可能存在(这也会导致类<代码> C <代码>将不负责<代码> b<代码>):


*mypytr1=…
错误;删除
*
@krsteeve默认情况下,我的构造函数在cpp类中从项目文件中声明。我刚刚添加了一个新变量,需要以这种方式访问它。@DavidRTribble这是一个键入错误,我现在将对其进行编辑。很抱歉,您发布的代码根本无法编译。我们可以为您修复它,但不清楚这是否有助于您在实际代码中找到错误。你需要拿出一个来演示这个问题。@ ReDouSE,我想你需要考虑使用共享指针。否则,跟踪您的对象将是一件麻烦事。
class C
{
public:
C() { }
B b;
class C
{
public:
C(B& bRef) : b(bRef) { }
B& b;