在C ++中创建一个指向结构或对象的指针数组

时间:2011-04-16 02:44:30

标签: c++ pointers struct

所以我基本上只是尝试接受一些文件输入,然后将这些数据放入几个结构中。我遇到的唯一问题是指向结构的指针。结构本身应该代表学生,我想将每个指针设置为它们的名称而不是任意变量。我尝试以某种方式执行此操作,我假设它在语法上是错误的,因为它不起作用。在下面的代码中,我使用temp数组递增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 个答案:

答案 0 :(得分:2)

好的,让我们从顶部开始吧。

你的代码是(在我重新格式化之前)一团糟。凌乱的代码更难阅读,更容易出错。

你有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');

我记得在推荐你之前看到这个阅读是不推荐的,尽管我并不完全确定。您可能想要更改此内容:

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 :(得分:1)

如果您希望能够按名称引用学生,请考虑使用map<string, student>map<string, student*>

这样您就可以通过students["Jack"]students["Jill"]推荐个别学生。