私は次のクラス定義を持っています...そして、fstreamオブジェクトについて疑問に思っています。
#ifndef CLIENTLIST_H
#define CLIENTLIST_H
#include <string>
#include <vector>
#include <fstream>
using namespace std;
class ClientList
{
private:
// A structure for the list
struct ListNode
{
char gender;
string name;
string phone;
int numInterests; // The number of interests for the client
vector<string> interests; // list of interests
string match;
struct ListNode *next; // To point to the next node
};
ListNode *head; // List head pointer
string name;
void detach(string); // to unmatch the corresponding client
public:
// Constructor
ClientList();
// Destructor
~ClientList();
// Linked list operations
void appendNode(char, string, string, int, vector<string>, string, fstream &);
string interestCompare(vector<string>, string, fstream &);
void unmatch(string, ClientList, fstream &);
void printMatch(fstream &);
void printFree(fstream &);
};
#endif
これは、クラスで fstream オブジェクトを使用しようとした 5 番目の方法ですが、どれも機能せず、さまざまな種類のエラーが発生しました。
これは、私が最近実装している関数の例です
//**************************************************
// appendNode appends a node containing the *
// value pased into num, to the end of the list. *
//**************************************************
void ClientList::appendNode(char gen, string nm, string ph, int numIntr,
vector<string> intr, string mch, fstream &dates)
{
dates.open("dates.txt", ios::out | ios::out);
ListNode *newNode; // To point to a new node
ListNode *nodePtr; // To move through the list
// Allocate a new node and store data in it.
newNode = new ListNode;
newNode->gender = gen;
newNode->name = nm;
newNode->phone = ph;
newNode->numInterests = numIntr;
newNode->interests = intr;
newNode->match = mch;
newNode->next = NULL;
// If there are no nodes in the list
// make newNode the first node.
if (!head)
head = newNode;
// Otherwise, insert newNode at end.
else
{
// Initialize nodePtr to head of list.
nodePtr = head;
// Find the last node in the list.
while (nodePtr->next)
nodePtr = nodePtr->next;
// Insert newNode as the last node.
nodePtr->next = newNode;
}
dates << "\nClient: " << newNode->gender << ", " << newNode->name << ", "
<< newNode->phone << ", " << newNode->numInterests << ", ";
for (int index = 0; index < newNode->numInterests; index++)
dates << newNode->interests[index] << ", ";
dates << newNode->match << ".\n";
cout << "\n\nAPPENDED\n\n";
dates.close();
}
これは main() から呼び出す方法の例です
//append to file
if (gender == tolower('m'))
{
match = Female.interestCompare(interests, name, dates); // compare the vector of interests to the client interests
// in the female list
Male.appendNode(gender, name, phone, numInterests, interests, match, dates);
}
しかし、私が言ったように、これは私の試みの 1 つにすぎず、どのようにクラスにファイルを開いて書き込みさせようとしても、プログラムがクラッシュするか、事後条件ではない何かを実行するようです。
それで、クラス内でファイルストリームを使用することさえ可能かどうか疑問に思っています。もしそうなら、それを行うために何を保持する必要がありますか。
注: 必ずしも特定の実装を探しているわけではありません。実装の背後にある「理由」に興味があります。将来、自分が何をしているのかを知ることができるように、心に留めておく必要があることを知りたい.