1

属性として文字の配列を持つクラスがあります。

class ClassA{
public:

  ClassA( char *fileName );

  char charArray[13][2];
};

ClassAコンストラクターは、ファイルから 26 個の値を読み取り、次のようにロードしcharArrayます。

ClassA::ClassA( fileName ){
   ifstream file;
   file.open( fileName );
   int contactOne, contactTwo;
   int pair=0;

   while( !file.eof() ){
     file >> contactOne;
     file >> contactTwo;
     if( !file.eof() ){
       charArray[pair][0] = (contactOne+65); // convert to Alpha UpperCase
       charArray[pair][1] = (contactTwo+65); // conv to Alpha UpperCase
       pair++;
     }
   }
}

ClassAは、オブジェクトへのポインターを含む別のクラスのコンストラクターで初期化され、 の属性として格納できるClassBようClassBになります。ClassAClassAClassB

class ClassA; // forward derive
class ClassB{
  public:
  ClassB( char **argv );

  ClassA *a_class
};

ClassB のコンストラクター:

ClassB::ClassB( argv ){
  ClassA a( argv[1] );
  a_class = &a;
}

ではmain、 の関連付けをテストしていClassAますClassB。forloop では、次の方法coutですべての値を取得charArrayします。

int main( int argc, char **argv ){
  ClassB b_class( argv );

  for( int i=0; i < 13; i++ ){
     cout << b_class.a_class->charArray[i][0] << endl;
     cout << b_class.a_class->charArray[i][1] << endl;
  }
}

ClassAの外で構築するとClassBcout << a.charArray[x][y];完全に機能し、からさまざまな大文字のアルファベット記号を出力しますcharArray

実際、コンストラクターにcout << a.charArray[x][y];ステートメントを追加してコンストラクターを使用しClassAて初期化しても、正しい値が に読み込まれ、大文字のアルファベット記号が出力されます。ClassAClassBcharArray

しかし、メインにあるものを実行すると、からの出力charArrayは非常に奇妙です。配列の最初のいくつかの値は予想どおりですが、最後の値は多少ランダムで、通常はランダムに配置された空白の値と疑問符です。あたかもポインタがロードされた値をcharArray正しい範囲から外したか、何らかの形で間違ったメモリ位置にアクセスしているかのようです。

どんな助けでも大歓迎です。私ClassAは奇妙な方法でアクセスしていますか?あるクラスの属性として他のクラスを持つ好ましい方法はありますか?

異常な出力:

A
E
B
J
C
M
D
Z

?
?
?
y

通常の出力:

A
E
B
J
C
M
D
Z
F
L
G
Y
H
X
I
V
K
W
N
R
O
Q
P
U
S
T
4

1 に答える 1

1

ClassA a( argv[1] );破棄されるローカル変数として定義し、そのメモリはコンストラクタaの終了時に無効になり、ガベージを指すようになります。ClassBa_class

より長い寿命が必要なため、それがdであることを確認する必要がありa_classます。を調べることをお勧めします。new ClassA(argv[1]);deletestd::unique_ptr

しかし...

そもそもなぜこれを行うのですか?その代わり、ClassAは に依存しないためClassBClassAを正式に定義するか、定義する前にインクルードするヘッダー ファイルを使用できますClassB。次に、前方定義を削除して、次のことができます。

class ClassB{
  public:
  ClassB( char **argv );

  ClassA a_class
};

ClassB::ClassB( argv ):a_class(argv[1]){
}

ポインターの混乱全体をなくすには。

オフトピック:

while( !file.eof() )そして、その同類は、期待どおりに機能することはほとんどありません。詳細はこちら:ループ条件内の iostream::eof が間違っていると見なされるのはなぜですか?

while( file >> contactOne >> contactTwo ){
    charArray[pair][0] = (contactOne+65); // convert to Alpha UpperCase
    charArray[pair][1] = (contactTwo+65); // conv to Alpha UpperCase
    pair++;
}

あなたが必要とすることをすべきです。

于 2015-11-16T22:38:31.883 に答える