2010-05-18 41 views
-1

我在解决这个问题时遇到了一些困难。在不同的C++类上访问初始化变量

其主要思想是,我在A类中初始化了一个类类型B的变量,类A.h将变量Z声明为public,如B * Z;

在类A.cpp中,我将它初始化为Z = new B();

现在,我想从类C访问该变量,我无法这样做。 CH包括阿和bh

这里去一些代码:

Car.h

#include "Model.h" 

class Car { 
public: 

    static Model *Z; 

} 

Car.cpp

#include "Car.h" 

void Car::init() { 
    Z = new Model(); 
} 

Model.h

Class Model {} 

Camera.h

#include "Model.h" 
#include "Car.h" 

class Camera {} 

Camera.cpp

Camera::init() { 
    Car::Z->getPos(); 
} 
+8

我不确定你到底有什么问题。你能发布实际的代码不工作吗? – 2010-05-18 20:43:19

+1

无法访问它意味着什么。你有错误信息吗? – 2010-05-18 20:43:47

+0

我和迈克尔......很难分辨没有代码的情况。您可能想要了解c/C++作用域规则。 – Doug 2010-05-18 20:51:44

回答

2

I initialized a variable of class type B in class A

#pragma once 
#include "B.h" 

class A 
{ 
    public: 

    B* Z; 
    A() 
    { 
     Z = new B(); 
    } 
} 

B.h

#pragma once 
class B 
{ 
} 

C.h

#pragma once 
#include "A.h" 

class C 
{ 
    A a; //here you construct A 
    C() 
    { 
     a.Z = new B(); //you can read/write Z 
    } 
} 

这应该工作!请注意包含#pragma once或标头防护装置/包括防护装置(http://en.wikipedia.org/wiki/Header_file),因此标题将不会包含两次(如果应该这样做)。

There are 3 classes, car, model and camera. in car I declare a new model Z and I want the camera to follow that model so I'll have to access the model positions in camera class

  • A =车
  • B =型号
  • C =相机
+0

#pragma曾经不是真正的标准,我相信它不受例如intell C++编译器(或几个版本之前)的支持。 包含守卫是处理多重包含的标准方式:http://en.wikipedia.org/wiki/Include_guard – 2010-05-18 21:26:40

+0

所以不会像当C构造时一样,对象B的内存将被分配在一个(When A的构造函数被调用),但在那之后,你在C的构造函数内部调用新的B并放在z处,所以不会导致内存泄漏? – mawia 2010-05-18 21:27:51

+0

@mawia:是的......但那不是重点。我只想表明你可以访问Z.我不想写一个测试方法...... :) – Simon 2010-05-18 21:39:47

1

它是一个静态变量?如果没有,你必须从类A的实例访问它。

从你写的,它听起来像它是静态的。在这种情况下,你丫不得不说

static B *Z; 
在A.cpp

然后,你必须定义它:

B *A::Z; 

然后在C.cpp,你可以像

访问
A::Z->whatever(); 
+0

我试过这个,当我尝试第二步时,我得到错误,它说B不是A – d0pe 2010-05-18 20:58:10

+0

FWIW的成员,定义它是B * A :: Z; – rotoglup 2010-05-18 21:03:29

+0

哎呀,我应该试图在发布之前编译它:)。 B * A :: Z;绝对正确。 – Chris 2010-05-18 21:34:26

1

你在做这样的事情?

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

所以,你必须

class A { 
public: 
    B* Z; 
}; 

class B { 
public: 
    // Empty 
}; 

class C { 
public: 
    // Empty 
}; 

这么说......没有理由为什么你应该能够访问Z.你的问题不IST足够percice说......但你应该不要

class C { 
public: 
    A* z_access; 
}; 

现在你可以使用A级 使用C类“一” Z但我们需要更多的信息,看看是怎么回事。

1

基于更新的问题:

你的问题是,你还没有真正定义的变量Car::Z任何地方。您在Car类中有声明,但是在任何地方都没有定义。

你需要的是补充,在car.cpp文件,该行:

Model* Car::Z; 

,或者任选,如果你想给Z初始值,是这样的:

Model* Car::Z = NULL; 

对于除常量整数以外的任何其他静态成员变量,这通常是需要的。您需要class { }块中的声明,然后您需要在相应的.cpp文件中定义,否则您将得到此错误。