2010-05-18 92 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文件中定義,否則您將得到此錯誤。