C ++通过指针访问嵌套对象的成员

时间:2016-03-29 21:53:17

标签: c++ pointers object

出于速度原因,我一直在使用指针传递对象。但是,当我尝试访问对象中的对象的成员变量时,我的程序不断崩溃。有没有我得到的东西?

/*
ClassA
 - ObjectB
   --Member X
*/

class A
{
   int x;
}

class B
{
   A* obj; // initialized in constructor
   B();
   func();
}

B::B(std::vector<A> vectorA)
{
   this->obj = &(vectorA.at(0))
}

B::func()
{
   A* pointerA = this->obj
   std::cout << pointerA->x << std::endl; // causes crash
}

3 个答案:

答案 0 :(得分:1)

您缺少半结肠

         A* pointerA = this->obj;

修复

class A
{
  int x;
};

你也错过了这个分号。 我得到的错误:

11:9:错误:ISO C ++禁止声明&#39; func&#39;没有类型[-fpermissive]

8:1:错误:可能无法在返回类型中定义新类型

8:1:注意:(在定义&#39; B&#39;之后可能缺少分号)

14:1:错误:原型为&B; B B :: func()&#39;与班级中的任何一个都不匹配&#39; B&#39;

11:4:错误:候选者是:int B :: func()

先修复它们。

答案 1 :(得分:1)

早期的海报,正确地删除了他们的评论,指出传递给我的构造函数的向量不是通过引用而被销毁,而是指针悬空。

  

B :: B(std :: vector vectorA)

应该是

  

B :: B(std :: vector&amp; vectorA)

谢谢你,有点陌生!

答案 2 :(得分:0)

喜欢@ user4581301指出:this->obj = &(vectorA.at(0))非常危险。这么多,一旦函数退出,指针就会悬空。

使用函数签名B::B(std::vector<A> vectorA),您的函数将创建传递给它的向量的副本,当函数退出时会被销毁。这意味着您刚创建的指针悬空。

我认为你的意思是做:

B::B(std::vector<A> &vectorA)

这样,您在函数内使用的向量实际上与您作为参数传递的向量相同。这样,只要传入的向量没有被销毁(或者像指出的那样调整大小),指针就是有效的。