Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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++_Variables_Class - Fatal编程技术网

在C++类中访问初始化变量

在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

我在这个问题上遇到了一些困难

主要思想是,我在类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"
#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;