2014-11-01 3 views
-2

Я использовал указатель/массив **char для хранения списка значений символов.C++ возвращающий адрес памяти, а не значение

У меня есть способ хранения значений, но мой метод для получения этих значений не был таким успешным.

Это мой метод, который устанавливает значения ...

char **names; 
char *input_name; 
int studentNameSize; 

void Students::setStudentNames() 
{ 
    names = new char*[studentNameSize]; 
    for(int i=0; i<studentNameSize; i++) 
    { 
     names[i] = new char[60]; 
     cout << "Input name" << i << ": \n"; 
     cin >> input_name; 
     strcpy(names[i],input_name); 
     cout << names[i] << "\n"; 
    } 
} 

Это мой метод, и он возвращает только размер памяти, а не фактические значения. Она возвращает 0x(size of the array, т.е. 0x03 вместо того что-то вроде Bob; Charles; Mike

const char** Students::getStudentNames() 
{ 
    for(int i=0; i<this->studentNameSize; i++) 
    { 
     return this->names[i]; 
    } 
} 

К сожалению, я новичок в C++, и мне нужна помощь с friend ostream& operator<<. В основном я знаю, как выводить в файл сейчас, но я не понимаю, как использовать метод friend ostream& operator<<. У меня есть что-то вроде этого, но я действительно потерял, как я могу выводить файл таким образом.

ostream& operator<< (ostream& ostream, const Students& students) 
{ 
    os << students.getStudentNames(); 
    return os; 
} 
+0

Вы понимаете, что 'return', well ... *** возвращает *** из функции? Если вы возвращаетесь в цикл for, вы не будете «возвращать массив». Вместо этого вы вернете первый элемент, а затем функция завершит выполнение. Кроме того, в C++ используйте 'std :: vector ' для массива строк. –

+1

Ваш вопрос, кажется, внезапно превращается в другой вопрос на полпути. Что происходит? –

+0

@LightnessRacesinOrbit, что происходит, очевидно, что OP не имеет представления об основных принципах языка, поэтому он не может с пользой и четко сформулировать свою проблему/вопрос. –

ответ

2

Это право здесь не будет делать то, что вы ожидаете. Оператор return немедленно покидает функцию, поэтому в первый раз, когда этот цикл будет выполнен, он вернется.

Так эффективно, этот код:

const char** Students::getStudentNames() 
{ 
    for(int i=0; i<this->studentNameSize; i++) 
    { 
     return this->names[i]; 
    } 
} 

Действительно означает следующее:

const char** Students::getStudentNames() 
{ 
    return this->names[0]; 
} 

Я считаю, что вы действительно хотите сделать это:

const char** Students::getStudentNames() 
{ 
    return this->names; 
} 

Этот бит кода возвращает всю переменную this->names, которая согласно названию функции getStudentNames - это то, что он делает.

Что касается части сериализации вашего вопроса, ваш код в основном правильный в этом случае. Он должен выглядеть следующим образом:

ostream& operator<< (ostream& os, const Students& students) 
{ 
    os << students.getStudentNames(); 
    return os; 
} 

И десериализовать:

istream& operator>>(istream& is, const Students& students) 
{ 
    is >> students.names; 
    return is; 
} 

Обратите внимание, что эти методы сериализации, при использовании более сложных объектов, гораздо более восприимчивы к повреждению данных. Вот некоторые further reading для вас.

Надеюсь, это помогло, удачи!

+0

Благодарим вас за ответ. Как изменить код, чтобы он мог вернуть все значения имен?Должен ли я хранить его в каком-то массиве или что-то в этом роде. Я был бы очень признателен, если бы вы могли помочь мне, поскольку я новичок в C++ – user4167396

+0

@ user4167396 Конечно, дайте мне минуту, чтобы обновить мой ответ. – phantom

+0

@ user4167396 Там вы идете! – phantom

Смежные вопросы