在C++类中访问初始化变量
我在这个问题上遇到了一些困难 主要思想是,我在类a中初始化了一个类类型为B的变量,类a.h将变量Z声明为公共的,如B*Z 在类A.cpp中,我将其初始化为Z=new B 现在,我想从C类访问该变量,但我无法这样做。C.h包括A.h和B.h 下面是一些代码: 汽车 Car.cpp在C++类中访问初始化变量,c++,variables,class,C++,Variables,Class,我在这个问题上遇到了一些困难 主要思想是,我在类a中初始化了一个类类型为B的变量,类a.h将变量Z声明为公共的,如B*Z 在类A.cpp中,我将其初始化为Z=new B 现在,我想从C类访问该变量,但我无法这样做。C.h包括A.h和B.h 下面是一些代码: 汽车 Car.cpp #include "Car.h" void Car::init() { Z = new Model(); } 模型h Class Model {} 照相机 #include "Model.h" #inclu
#include "Car.h"
void Car::init() {
Z = new Model();
}
模型h
Class Model {}
照相机
#include "Model.h"
#include "Car.h"
class Camera {}
Camera.cpp
Camera::init() {
Car::Z->getPos();
}
它是一个静态变量吗?如果不是,则必须从类A的实例访问它 从你写的来看,听起来好像是静态的。在这种情况下,在A.h.你必须说
static B *Z;
然后在A.cpp中,您必须定义它:
B *A::Z;
然后在C.cpp中,您可以像
A::Z->whatever();
我初始化了一个类类型的变量
A班B
B.h
C.h
这应该管用!请注意只包含一次pragma或一个header-guard/include-guard,这样,如果应该这样做的话,就不会包含两次header
有三个等级,汽车,模型和
照相机我在车里申报了一辆新的Z型车
我想让摄像机跟着它
所以我必须访问模型
摄影机类中的位置
A=汽车
B=型号
C=摄像机
你在做这样的事吗
class A{
public:
A() : m_B( new B() );
B* getB() const { return m_B;}
private:
B *m_B;
};
class C{
public:
B* getB() const { return m_A.getB(); }
private:
A m_A;
};
你有吗
class A {
public:
B* Z;
};
class B {
public:
// Empty
};
class C {
public:
// Empty
};
所以说…你没有理由可以访问Z。你的问题不足以说…但你应该这样做
class C {
public:
A* z_access;
};
现在您可以通过使用类a在类C中使用Z。
但我们需要更多的信息来了解到底发生了什么 根据更新的问题: 您的问题是,您实际上没有在任何地方定义Car::Z变量。在Car类中有一个声明,但在任何地方都没有定义 您需要在car.cpp文件中添加以下行:
Model* Car::Z;
或者,如果您想给Z一个初始值,也可以选择如下:
Model* Car::Z = NULL;
对于不是常量整数的静态成员变量,通常需要这样做。您需要在类{}块中声明,然后还需要在相应的.cpp文件中定义,否则会出现此错误。我不确定您到底遇到了什么问题。你能发布不起作用的实际代码吗?你不能访问它是什么意思。你收到错误信息了吗?我和Michael在一起。。。如果没有代码,很难判断发生了什么。你可能想复习一下c/c++范围规则。好的。。。答案现在越来越奇怪了。。。请告诉我们更多!:斯杜德,只需粘贴你的代码。我们不会偷它,我们保证=PI尝试了这个,当我尝试第二步时,我得到了错误,它说B不是AFWIW的成员,定义为B*a::Z;哎呀,我应该在发布之前尝试编译它:。B*A::Z;事实上,PrimMA不是真正的标准,我相信它不支持,例如,因特C++编译器或几个版本之前。包含保护是处理多重包含的标准方法:那么,当构造C时,对象B的内存将在A的构造函数中分配,而在调用A的构造函数之后,您将在C的构造函数中调用新的B并将其置于z,那么它不会导致内存泄漏吗?@mawia:是的。。。但这不是重点。我只想表明您可以访问Z。我不想编写测试方法…:
class A {
public:
B* Z;
};
class B {
public:
// Empty
};
class C {
public:
// Empty
};
class C {
public:
A* z_access;
};
Model* Car::Z;
Model* Car::Z = NULL;