Hallo,
ich hab da mal wieder ein Problem. Ich habe eine Klasse Database erstellt und in der 2 friend Methoden deklariert. Die erste Methode hat komischerweise Zugriff auf die als private deklarierten Variablen, bei der 2ten Methode bekomme ich aber Fehler angegeben wenn ich kompilieren will.
Hier mal Teile des Codes
Die Header-Datei (Database.H)
Und die .C Datei (DBProcessing.C)
Nagut, ich sehe gerade da sind 3 friend Methoden drin. Aber nur bei der saveDB macht er Probleme. Beim ausführen von make bekomme ich in der Funktion immer angemeckert, dass die std::string robot und co private sind im Kontext von file << db.robot; ...
Wenn mir einer helfen könnte, wäre ich ihm/ihr sehr dankbar.
Gruss
Der Wolf
ich hab da mal wieder ein Problem. Ich habe eine Klasse Database erstellt und in der 2 friend Methoden deklariert. Die erste Methode hat komischerweise Zugriff auf die als private deklarierten Variablen, bei der 2ten Methode bekomme ich aber Fehler angegeben wenn ich kompilieren will.
Hier mal Teile des Codes
Die Header-Datei (Database.H)
Code:
class Database {
public:
Database();
Database(std::string robot, std::string sensors, std::string furtherInfo);
virtual ~Database();
// ======================================================================
// Friend methods
// ======================================================================
//!Loads a database from file
friend void loadDB(Database &db, const char *filename);
//!Stores the database
friend void saveDB(Database &db, const char *filename);
private:
// Trajectorie-Managing stuff
std::map<std::string, Trajectorie*> trajectories;
Trajectorie *currentTr;
// Flag indicating that something had changed which is
// not been stored yet
bool hasChanged;
int nrTrajectories;
std::string robot;
std::string sensors;
std::string furtherInfo;
// Private methods
friend std::vector<std::string> parseLine(std::string line);
};
Und die .C Datei (DBProcessing.C)
Code:
#include "Database.H"
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
void loadDB(Database &db, const char *filename) {
std::ifstream file;
file.open(filename, std::ios_base::in);
if (file.good()) {
std::string line;
// set pointer to file-beginning
file.seekg(0L, std::ios::beg);
// first line always contains meta information
getline(file, line);
std::vector<std::string> result = parseLine(line);
db.robot = result[0];
db.sensors = result[1];
db.furtherInfo = result[2];
// read file line by line
while (! file.eof()) {
getline(file, line);
// Maybe there is an empty line somewhere that could not
// be parsed
if (line != "") {
std::vector<std::string> result = parseLine(line);
if (result[0] == "traject") {
// makeTrajectorie(result);
// } else {
// makeRecord(result);
}
}
}
} else {
std::cout << "Datei nicht gefunden." << std::endl;
}
}
void saveDB(Database &db, std::string filename) {
std::ofstream file;
file.open(filename.c_str());
// Write whole database to file
// Write meta informations
file << db.robot;
file << "|";
file << db.sensors;
file << "|";
file << db.furtherInfo;
file << "\n";
// Write every record
std::map<std::string, Trajectorie*> trajectories =
db.trajectories;
std::map<std::string, Trajectorie*>::iterator curTr;
for (curTr = trajectories.begin(); curTr != trajectories.end(); ++curTr) {
file << "traject";
file << "|";
file << ((*curTr).second)->getName();
file << "|";
file << ((*curTr).second)->getFurtherInfo();
file << "\n";
/** // Write every record stored in this trajectorie
std::string trName = ((*curTr).second)->getName();
std::list<Record*> records = db.getTrajectorie(trName)->getRecords();
std::list<Record*>::iterator curRec;
for (curRec = records.begin(); curRec != records.end(); ++curRec) {
file << (*curRec)->getMotorCommand();
file << "|";
file << (*curRec)->getMCValues();
file << "|";
file << (*curRec)->getSensorValues(0);
file << "|";
file << (*curRec)->getSensorValues(1);
file << "|";
file << (*curRec)->getImageLinks(0);
file << "|";
file << (*curRec)->getImageLinks(1);
file << "\n";
} **/
}
}
std::vector<std::string> parseLine(std::string line) {
std::vector<std::string> result;
while(true) {
int pos = line.find("|");
if (pos != -1) {
std::string temp = line.substr(pos);
int tempLength = temp.length();
line.erase(pos, tempLength);
result.push_back(line);
temp.erase(0,1);
line = temp;
} else {
// Append links to images after motion to result vector
if (line != "") {
result.push_back(line);
}
break;
}
}
return result;
}
Nagut, ich sehe gerade da sind 3 friend Methoden drin. Aber nur bei der saveDB macht er Probleme. Beim ausführen von make bekomme ich in der Funktion immer angemeckert, dass die std::string robot und co private sind im Kontext von file << db.robot; ...
Wenn mir einer helfen könnte, wäre ich ihm/ihr sehr dankbar.
Gruss
Der Wolf