出于速度原因,我一直在使用指针传递对象。但是,当我尝试访问对象中的对象的成员变量时,我的程序不断崩溃。有没有我得到的东西?
/*
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
}
答案 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)
这样,您在函数内使用的向量实际上与您作为参数传递的向量相同。这样,只要传入的向量没有被销毁(或者像指出的那样调整大小),指针就是有效的。