Probleme mit friend methode

Der Wolf

Erfahrenes Mitglied
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)
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
 
Hallo,

du solltest aufpassen das die Signaturen von Deklaration und Definition deiner Methode saveDB übereinstimmen.

Soll-Situation:

Code:
class Database {
  //...
  friend void saveDB(Database &db, const char *filename);
  //...
};

void saveDB(Database &db, const char *filename)
{
   //...
}

Ist-Situation:
Code:
class Database {
  //...
  friend void saveDB(Database &db, const char *filename);
  //...
};

void saveDB(Database &db, std::string filename)
{
   //...
}

Gruß,
RedWing
 
Ah danke.

Habe ich irgendwie nicht mehr gesehen gehabt. Frei nach dem Motto "Ich sehe den Wald vor lauter Bäumen nicht mehr." ;)

9 Stunden Programmieren ist irgendwann anstrengend.;-)
 
Zurück