2016-09-23 16 views
0

まあまあ、クラスで新しく、2つのクラスを持つ単純なプログラムを作成しようとしています。クラスAとクラスBです。私は、クラスAのコンストラクタで変数を初期化しようとしていますし、何らかのアクションを行い、クラスBに渡します。したがって、クラスAは基本クラスです。 ?だから私は2つの質問1)なぜコンストラクタ()が最初に呼び出さ冊のコンストラクタに応じて変数を宣言しないを持っているクラスAとクラスBのC++のコンストラクタと別のクラスに変数を渡す

error: ‘i’ was not declared in this scope

- 私はプログラムをコンパイルするときしかし、私は2つの間違いを得ましたか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の別の変数を宣言します。あなたがAのメンバ変数として 'int i;'を追加すると、これは整数j.iと異なる整数k.iが存在することを意味します。私はメンバーA :: iのこれをかなり移譲してはいけません。 –

答えて

2

まず第一に、良い本を取得:

The Definitive C++ Book Guide and List

と基礎を理解します。あなたの質問は、C + +のあなたの理解に今すぐ完全な混乱があることを示します。

実際のQにつきまして

1)C-torはクラスメンバー変数を宣言しません.C-torは関数でもあるため、ローカル変数のみを宣言できます。次のようにメンバー変数を明示的に宣言する必要があります。

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

2)「転送」という用語自体は正しくありません。この場合、2つのクラスは継承階層にあるため、変数iはクラスBに継承され、protectedと宣言すると、その方法でアクセスできます。関数B::showme()が正しく定義されています。最初の部分を修正すると、この例が機能します。

3)がクラスオブジェクトを混同しないを行います。クラスAのオブジェクトが宣言されている場合、それはクラスAまたはBの別のオブジェクトには決して関係しません。 jkint iのプライベートインスタンスを共有します((a)を修正した場合)。kのインスタンスijのインスタンスと同じにする場合は、コピーコンストラクタまたはgetter/setter関数のペアを実装します。

+0

ありがとう、私はまだコンストラクタとA(int _i)と少し混乱しています:i(_i){};しかし、それは働いた、と私はそれをよりよく理解するためのより良い本を見つけるでしょう。ありがとう。 –

+0

@alex_mikeこれは 'A(int _i){i = _i; } '。 – iksemyonov

+1

@iksemyonovほとんどのショートカット。 「高価な」オブジェクトの場合は、初期化リストが必要です。また、初期化リストは参照クラスメンバーのための*必須*です。 – vsoftco

関連する問題