包含"random"值的类的数组属性(通过另一个类的指针访问时)

Array attribute of class containing "random" values when accessed via a pointer from another class

本文关键字:指针 另一个 访问 属性 random 数组 包含      更新时间:2023-10-16

我有一个类,它有一个字符数组作为属性。

class ClassA{
public:
  ClassA( char *fileName );
  char charArray[13][2];
};

ClassA构造函数从文件中读取26个值并加载它们以如下方式转换为CCD_ 2。

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包含指向ClassA对象的指针,从而允许将ClassA存储为ClassB的属性。

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中,我正在测试ClassAClassB中的关联。在forloop I cout中,CCD_。

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;
  }
}

当我在ClassB之外构造ClassA时,cout << a.charArray[x][y];可以完美地工作,从charArray输出各种大写字母符号。

事实上,即使我将cout << a.charArray[x][y];语句添加到ClassA构造函数中,并使用charArray1构造函数初始化ClassA,也会将正确的值加载到charArray中,并输出大写字母符号。

然而,当我执行我主要拥有的内容时,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

ClassA a( argv[1] );a定义为一个局部变量,该变量在从ClassB构造函数退出时将被销毁,并且其内存将变为无效,从而使a_class指向垃圾。

由于a_class需要更长的使用寿命,因此必须使用new ClassA(argv[1]);并确保其为deleted。我建议查看std::unique_ptr

但是

为什么首先要这样做?相反,由于ClassA不依赖于ClassB,因此可以在定义ClassB之前正式定义ClassA或包括其头文件。然后你可以删除正向定义和:

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++;
}

应该做你需要做的事。