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包含指向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;
}

in main,我正在测试ClassAin的关联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

但是,当我执行 main 中的内容时,输出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为将被销毁的局部变量,其内存在从ClassB构造函数退出时变为无效,a_class指向垃圾。

由于您需要更长的使用寿命,因此a_class您必须new ClassA(argv[1]);确保它是deleted。我建议调查std::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 回答