我正在尝试根据用户输入设置学生的出勤率。我运行它的问题是尝试获取该输入并将其分配给每个学生的数据。
我所拥有的所有数据都是从文件中读取到单个链接列表中。此数据类型的结构在我的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 ©Object)
{
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 ©Object);
~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 ©Object);
~ListNode();
data getData() const;
ListNode *getNextPtr() const;
ListNode & operator = (ListNode &rhs);
private:
data mData;
ListNode *mpNext;
};
#endif
答案 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包含指向链表中某些数据的指针,并可根据需要进行修改。