Атрибут массива класса, содержащий «случайный» значения при доступе через указатель из другого класса

У меня есть класс, который имеет массив символов в качестве атрибута.

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

Конструктор класса B:

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

В mainЯ проверяю ассоциацию ClassA в ClassB,
В замкнутом я 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 вне ClassB, cout << a.charArray[x][y]; работает отлично, выводя различные заглавные буквы алфавита из charArray,

Действительно, даже когда я добавляю cout << a.charArray[x][y]; заявление в ClassA конструктор и инициализация ClassA с помощью ClassB конструктор, правильные значения загружаются в 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

1

Решение

ClassA a( argv[1] ); определяет a как локальная переменная, которая будет уничтожена, а ее память станет недействительной при выходе из ClassB конструктор, уходя a_class указывая на мусор.

Так как вам нужно больше жизни для a_class тебе придется new ClassA(argv[1]); и убедитесь, что это deleteд. Я рекомендую заглянуть в std::unique_ptr.

Почему это в первую очередь? Вместо этого, так как ClassA не зависит от ClassB, ClassA может быть формально определен или его заголовочный файл включен ранее 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++;
}

Должен делать то, что вам нужно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]