2010-12-22 115 views
1

我們只是說我們有兩個類,AB
這是對他們倆的代碼如何從其他類訪問不同類中的變量?

class A 
{ 
public: 
    int x; 
}; 

class B 
{ 
public: 
    int y; 
    void FindY() { y = x + 12; } 
}; 

void something() 
{ 
    A fs; 
    B fd; 
    fs.x = 10; 
    fd.FindY(); 
} 

的問題是,我想訪問X,但我不想通過什麼作爲參數傳遞給我的功能我看着朋友和繼承,但似乎都沒有幫助我,糾正我,如果我錯了。
一些如何我需要找到函數FindY()中的x。
我正在與靜態方法,但在我的情況下,我得到這個錯誤。

錯誤2錯誤LNK2001:無法解析的外部符號「公用:靜態類std::vector<class GUIDialog *,class std::allocator<class GUIDialog *> > Window::SubMenu" ([email protected]@@[email protected]@@[email protected]@@@[email protected]@@[email protected]@A) C:\Users\Owner\documents\visual studio 2010\Projects\Monopoly\Monopoly\Window.obj 這是我如何宣稱它

static vector<GUIDialog *> SubMenu; 

我得到的,因爲

SubMenu.resize(3); 
+3

`x`不無A`的`一個實例存在。你需要從* somewhere *中得到它。 – GManNickG 2010-12-22 09:35:57

+2

您需要創建類「A」的對象,然後使用「A.x」。你在問那個笏還是我錯過了什麼? – Naveen 2010-12-22 09:36:01

回答

7

三種不同的方法的這一行的錯誤:

  1. Make B :: FindY tak爲E的甲對象作爲參數

    class B { 
    public: 
        void FindY(const A &a) { y = a.x + 12; } 
    }; 
    
  2. 做出:: X靜態

    class A { 
    public: 
        static int x; 
    }; 
    class B { 
    public: 
        void FindY() { y = A::x + 12; } 
    }; 
    
  3. 製作乙從A繼承

    class B : public A { 
    public: 
        void FindY() { y = x + 12; } 
    }; 
    

CashCow還指出更在他的回答中做到這一點。

1

就這樣,x不是A類的變量,而是類A的對象變量(「實例」)。至少有兩種方法可以使x訪問從B::findY不經過任何的功能:

  • 實例化B::findY函數內部A類的一個對象:
 
    class B 
    { 
    public: 
     int y; 
     void FindY() { A a; y = a.x + 12; } 
    }; 
  • x一靜態變量,所以它是類本身的一個變量。你並不需要實例在這種情況下的對象,但是變量將共同爲A類型的所有對象(所以你不能對不同對象的x不同的值):
 
    class A 
    { 
    public: 
     static int x; 
    }; 

    class B 
    { 
    public: 
     int y; 
     void FindY() { y = A::x + 12; } 
    }; 
1

假設一個是正確的,你不能改變它,即x是一個成員變量,你需要一個A的實例才能使用它的x成員。

因此,我們可以修改B,但是您需要FindY()來不帶參數。

因此,我們需要在A帶來與之前的通話並將其存儲爲一個類的成員。

class B 
{ 
public: 
    A a; 
    int y; 
    void FindY() { y = a.x + 12; } 
}; 

這只是一個提綱。對於函數爲operator()的「函子」類來說,這是常用的方法,並且需要固定數量的期望參數,但我們需要更多。整個boost :: bind基於這個原理。

相關問題