【问题标题】:How to access pointer of a class pointing to another pointer of a class pointing to a value如何访问指向一个类的另一个指向值的指针的类的指针
【发布时间】:2013-09-08 06:36:51
【问题描述】:

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

我有 3 个课程: 啊哈

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);
  }
}

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

提前感谢您的帮助。

【问题讨论】:

  • *mypytr1 = ... 错误;删除*
  • @krsteeve 我的构造函数默认在项目文件中的 cpp 类中声明。我刚刚添加了一个新变量,我需要通过这种方式访问​​它。
  • @DavidRTribble 这是一个输入错误,我现在将对其进行编辑。对此感到抱歉
  • 您发布的代码远不能编译。我们可以为您修复它,但尚不清楚这是否会帮助您在实际代码中找到错误。您需要提出SSCCE 来证明问题。
  • @redRose 我认为您需要考虑使用共享指针。否则跟踪你的对象会很麻烦。

标签: c++ pointers indexoutofboundsexception


【解决方案1】:

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

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

class C
{
public:
C() { bPtr = new B(); }
B* bPtr;

现在,如果C 实例中包含的B 实例的生命周期与C 实例的生命周期相关联,那么bPtr 按值聚合似乎是合理的~>即成为具有自动存储持续时间的对象而不是指针:

class C
{
public:
C() { }
B b;

这将减少与使用此类裸指针相关的难看的内存管理。您的代码也更不容易出错。

或者,如果您需要在更多对象之间共享此 B 实例,您还可以考虑设置一个约束 "如果没有 B 实例,C 实例将无法存在"(这也会导致该类C不会对b的存在负责):

class C
{
public:
C(B& bRef) : b(bRef) { }
B& b;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多