从另一个类中设置一个类的数据

时间:2015-03-30 05:02:56

标签: c++ linked-list

我正在尝试根据用户输入设置学生的出勤率。我运行它的问题是尝试获取该输入并将其分配给每个学生的数据。

我所拥有的所有数据都是从文件中读取到单个链接列表中。此数据类型的结构在我的node.h中声明。

所以我要问的是如何在菜单类中修改源自Node类的值?

Menu.cpp

   void Menu::chooseMenu(ifstream *input, List L1)
{
    data temp;
    //data plswork[12];
    char holder[30];
    char junk[30];
    int i=1,j=1;

    do{
    system("cls");
    cout<<"1. Import"<<endl;
    cout<<"2. Load Master"<<endl;
    cout<<"3. Store Master"<<endl;
    cout<<"4. Mark Absence"<<endl;
    cout<<"5. Generate Report"<<endl;
    cout<<"6. Exit"<<endl;
    cout<<""<<endl;
    cin>>selection;

    if(selection == 1)//import
    {
        while(!input->eof())
        {
            memset(holder,0,30);

            if(i==3 && j != 1)
            {
                input->getline(holder,30,'"');
                input->getline(holder,30,'"');
                input->getline(junk,30,',');
            }
            else
            {
                input->getline(holder,30,',');
            }

            if(i==1)
            {
                strcpy(temp.record, holder);
                //cout<<temp.record<<endl;
                i++;
            }
            else if(i==2)
            {
                strcpy(temp.ID, holder);
                //cout<<temp.ID<<endl;
                i++;
            }
            else if(i==3)
            {
                strcpy(temp.name, holder);//read between quotes
                //cout<<temp.name<<endl;
                i++;
                j=2;
            }
            else if(i==4)
            {
                strcpy(temp.email, holder);
                //cout<<temp.email<<endl;
                i++;
            }
            else if(i==5)
            {
                strcpy(temp.units, holder);
                //cout<<temp.units<<endl;
                i++;
            }
            else if(i==6)
            {
                strcpy(temp.major, holder);
                //cout<<temp.major<<endl;
                i++;
            }
            else if(i==7)
            {
                strcpy(temp.grade, holder);

                //cout<<temp.grade<<endl;
                L1.insertOrder(temp);
                i=1;
            }

        }
    }

    else if(selection == 2)//load master
    {

    }

    else if(selection == 3)//store master
    {

    }

    else if(selection == 4)//mark absence
    {
        while(L1.nextPtr() != NULL)
        {
        char name;
            cout<<"Bruce :"<<L1.getDataL().absent<<endl;
            cout<<"Is "<<L1.getDataL().name<<" present? (Y/N)"<<endl;
            cin>>name;
            if(name == 'y' || name == 'Y')
            {
                L1.setAtt(L1.getDataL(),1); // This is where I try to set attendance to 0 or 1. 
                cout<<L1.getDataL().absent<<endl;
            }
            else
            {
                L1.setAtt(L1.getDataL(),0);
            }

            L1.nextPtr();
            system("pause");
        }
    }

    else if(selection == 5)//gen report
    {

    }

    }while(selection != 6);

}

Node.cpp

#include "Node.h"

ListNode::ListNode (ListNode &copyObject)
{
    this->mData = copyObject.mData;
    this->mpNext = copyObject.mpNext;
}

ListNode::~ListNode ()
{
    // does nothing
    cout << "exiting listnode object - going out of scope" << endl;
}

ListNode * ListNode::getNextPtr () const
{
    return mpNext;
}

data ListNode::getData() const
{
    return mData;
}

ListNode::ListNode(data newData)
{
    mData = newData;
    this->mpNext = NULL;
}

List.h

#include "Node.h"

#ifndef LinkedList_H
#define LinkedList_H
using std::ostream;

class List
{
    friend ostream & operator << (ostream &lhs, List &rhs);
    friend ListNode;

    public:
        List ();
        List (List &copyObject);
        ~List ();

        List & operator = (List &rhs);

        ListNode *makeNode (data newNode);
        bool insertOrder (data Node);
        bool deleteNode (data Node);
        data getDataL();
        ListNode *nextPtr();
        void setAtt(int atten);




    private:
        ListNode *pHead;
};
#endif

ListNode.h

#ifndef ListNode_H
#define ListNode_H

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

struct data
    {
        char record[8];
        char ID[12];
        char name[30];
        char email[30];
        char units[6];
        char major[8];
        char grade[14];
        int absent;
        char dateabsent[32];
    };


class List;


class ListNode
{
    friend class List;
    friend struct data;
    public:
        ListNode();
        ListNode(data newData);
        //ListNode(char newrecord[], string newID, string newname, string newemail, string newunits, string newmajor, string newgrade);
        ListNode(ListNode &copyObject);
        ~ListNode();

        data getData() const;
        ListNode *getNextPtr() const;

        ListNode & operator = (ListNode &rhs);

    private:
        data mData;
        ListNode *mpNext;
};
#endif

2 个答案:

答案 0 :(得分:1)

好吧,所以,你很难在这段代码中获得任何好的答案,因为你的数据结构构造得不是很好,你只需要一个类,也许两个,就可以做到这一点。贝娄是两类宣言:

struct data
{
    char record[8];
    char ID[12];
    char name[30];
    char email[30];
    char units[6];
    char major[8];
    char grade[14];
    int absent;
    char dateabsent[32];
};
class listNode
{
    listNode* next;
    data data;

public:
    listNode(data& d);    //Will copy d into data, you will need to define
    listNode();           //Will initialize a blank data, you will need to define
    ~listNode();          //Definitely need a destructor

    data& getMutableData();
    const data& getImutableData() const;

    void insert(listNode* n);
    bool delete(listNode* n);
    listNode* next();

};

您拥有的包装类对于链表实际上是不必要的,并且您希望以指针或引用的方式传递大型数据结构,您永远不应该返回&#34;数据&#34;,只有&#34;数据*&#34;和&#34;数据和&#34;。 &#34;数据&#34;应保留仅用于创建新对象。这里执行一些重要的功能:

void listNode::insert(listNode* n)
{
    if(next!=NULL)
        next->insert(n);
    else
        next = n;
}
bool listNode::delete(listNode* n)
{
    if(next==NULL)
        return false;
    if(next == n)
    {
        listNode* temp = next;
        next = next->next();
        delete temp;
        return true;
    }
    return next->delete(n);
}

您遇到问题的原因基本上是您的数据结构实施得很差,需要重新设计。我上面所说的绝不是唯一的甚至是最好的实现(特别是,几乎没有封装或数据保护),但它似乎接近您正在寻找的单链接列表功能。

答案 1 :(得分:-1)

我不知道setAtt上的List方法应该如何运作。因此,不使用setAtt,一种解决方案是使getDataL返回data *(指向数据结构的指针)。现在,您的main包含指向链表中某些数据的指针,并可根据需要进行修改。