2016-09-23 161 views
0

好吧,只是新的類和試圖創建一個簡單的程序,它有2個類。 A類和B類。嗯,我試圖在類A中的構造函數中初始化我的變量,然後做一些動作並將它傳遞給B類,我也可以做一些動作。所以A類是一個基類。然而,當我編譯程序我有兩個錯誤 -C++的構造函數,並將變量傳遞給另一個類

error: ‘i’ was not declared in this scope

對於A類和B類所以,我有兩個問題1)爲什麼構造函數不聲明變量(按稱爲第一書構造函數)? 2)我可以如何將變量從A類傳遞到B類中?

#include <iostream> 
#include <cstdio> 
using namespace std; 
class A { 
    public: 
     A(){ 
      int i =1;   
     } 
     ~A(){} 
     int foo() { 
      int p = i+1; 
      i++; 
      return p; 
     } 

}; 

class B : public A { 
    public: 
     int showme() { 
      return i; 
     } 
}; 

int main() { 
    A j; 
    B k; 
    cout<< k.showme()<<endl; 
    cout<< j.foo()<<endl; 
return 0; 
} 
+0

那麼我必須在構造函數中聲明什麼呢?我認爲構造函數是聲明變量? –

+1

我可能是錯的,但它聽起來像這也可能有助於指出。在這段代碼中,你聲明瞭一個類A的變量和一個單獨的B類變量。當你將'int i;'作爲A的成員變量添加時,這意味着將會有一個整數j.i和一個不同的整數k.i.我不會稱之爲成員'A :: i'的相當轉移。 –

回答

2

首先,獲得一本好書:

The Definitive C++ Book Guide and List

,並與基本熟悉。你的問題表明,在你理解C++的時候現在有一個完整的混亂。

現在到實際的Q's。

1)C-tor不是聲明一個類成員變量,它只能聲明一個局部變量,因爲c-tor也是一個函數。您需要明確聲明成員變量,如下所示:

class A { 
    int i; 
public: 
    A(int _i): i(_i) { } 
}; 

2)術語「傳輸」本身是不正確的。在這種情況下,這兩個類位於繼承層次結構中,因此變量i由類B繼承,並且如果您聲明它爲protected,那麼它將以您的方式訪問。功能B::showme()已正確定義。修復第一部分,並且示例正在工作。

3)不要混淆對象。當有A類別的對象聲明時,它與AB的另一個對象無關。 jk分享他們自己的私人實例int i(前提是您修復了(a)),並且如果您希望ki的實例等於j的實例,您可以實現一個拷貝構造函數或一對getter/setter函數。

+0

謝謝,我還是有點困惑於構造函數和A(int _i):i(_i){};但它有效,我會找到一本更好的書來更好地理解它。謝謝。 –

+0

@alex_mike這是說'A(int _i){i = _i; }'。 – iksemyonov

+1

@iksemyonov幾乎是一條捷徑。對於「昂貴」的對象,初始化列表是要走的路,否則你可以使用default-construct plus assign。另外,初始化列表對於引用類成員是強制性的。 – vsoftco

相關問題