Создание массива указателей на структуры или объекты в C ++ - PullRequest
0 голосов
/ 16 апреля 2011

Так что я в основном просто пытаюсь взять какой-нибудь файл ввода, а затем взять эти данные и разделить их на несколько структур. Единственная проблема, с которой я столкнулся, связана с именованием указателей на структуры. Сами структуры должны представлять студентов, и я хотел установить каждый указатель как одно из их имен, а не как произвольную переменную. Я пытался сделать это так, что я считаю, что синтаксически неправильно, потому что это не сработало. В приведенном ниже коде я увеличиваю цикл for с помощью временного массива, потому что каждая 4-я позиция - это новый студент. Любые идеи о том, как я мог бы пойти по этому поводу?

#include<iostream>
#include<iomanip>
#include"student.h"
#include"creditcard.h"
#include<fstream>
using namespace std;

int main ()
{
    string creditcards[20];
    int i;
    int x;
    int amount;
    string temp[20];
    ifstream infile;
    string filename;
    int count;
    int numstudents;
    string newstring="";
    string pointers[20];

    cout<<"enter the file name of which you've stored your"<<endl
        <<"credit card infomation"<<endl;

    getline(cin,filename,'\n');
    infile.open(filename.c_str());

    count=0;
    getline(infile,temp[count],'\n');
    while(! infile.eof())
    {
        count++;
        getline(infile,temp[count],'\n');          

        numstudents= (count/4);
        if(numstudents < 1 || count%4 != 0)
        {
            cout<<"incorrect data file"<<endl;
        }
    }

    cout<<numstudents<<endl;

    for(i=0,x=0; i<numstudents;i++,x+4)
    {
        student *temp[x];
        temp[x] = new student;
        pointers[i] = temp[x];
    }

    for(i=0;i<numstudents;i+4)
    {
        cout<<temp[i]<<endl;
    }

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

Хорошо, начнем сверху.

Ваш код был (до того как я его переформатировал) беспорядок. Грязный код труднее читать, и, скорее всего, в нем есть ошибки.

У вас есть 3 массива, каждый из которых содержит 20 строк. Зачем тебе так много?

Один из них назван temp; необходимость использовать это в качестве имени переменной является хорошим показателем того, что вы где-то неправильно обрабатываете данные.

Вы объявляете int count относительно рано, а затем инициализируете его до 0. Хотя это и не обязательно плохо, но это не самый лучший метод (при необходимости делайте оба сразу).

Вы можете объявлять локальные переменные более чем в строке, но вам не нужно объявлять их все в верхней части функции. Это не обязательно в C ++.

int main ()
{
    string creditcards[20];
    int i = 0, x = 0, amount = 0;

(законно, но может и не понадобиться)

Как правило, лучше объявить и инициализировать переменную одновременно, непосредственно перед тем, как вам это понадобится:

int count = 0;

getline(infile, temp[count], '\n');

Я помню, что читать, пока вы не нажмете eof, не рекомендуется, хотя я не совсем уверен в этом. Вы можете изменить это:

while ( !infile.eof() )
{

Итак, первая фактическая ошибка, которую я вижу здесь, заключается в том, что вы читаете строку с шагом count, а затем читаете еще одну строку, прежде чем действовать. Это намеренно, и если да, то почему это необходимо? Выполнение getline и приращения внутри цикла будет более читабельным и потенциально более надежным.

    count++;
    getline(infile, temp[count], '\n');          

Эта строка - ошибка, я думаю:

 for(i=0,x=0; i<numstudents;i++,x+4)

Последний раздел i++, x+4. Это не меняется x.

Следующий цикл после этого обрабатывает i таким же образом, как этот цикл использует x, так что вы, вероятно, можете объединить эти два.

Теперь, вдобавок ко всему, массивные временные массивы не являются решением этой проблемы (или любой другой, о которой я могу думать).

Для хранения такого рода данных вам нужно просмотреть std::map<std::string, student*> или std::vector<student*>. Вектор позволит вам при необходимости переместить новую студенческую структуру на задний план, а карта позволит вам набирать их по имени и затем извлекать, что-то вроде этого:

typdef map<string, student*> studentmap;
studentmap students;

studentmap::iterator iter = students.find("Bob");
if ( iter != students.end() )
{
    student * bob = iter->second;
    // Work with data
}

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

1 голос
/ 16 апреля 2011

Если вы хотите иметь возможность ссылаться на студентов по имени, рассмотрите возможность использования map<string, student> или map<string, student*>.

. Это позволит вам ссылаться на отдельных студентов через students["Jack"] или students["Jill"]..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...