У меня есть класс, который имеет массив символов в качестве атрибута.
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
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++;
}
Должен делать то, что вам нужно.
Других решений пока нет …