friend - Funtkionen, Zugriffsrechte?!

PPatrickFfm

Grünschnabel
Hallo!

Die Frage ist vielleicht ein bißchen blöd, aber welche Zugriffsrechte haben friend-Funktionen zu einer Klasse X?
Ich dachte (bisher), sowohl auf private als auch als protected deklarierte Elemente von X. Dem scheint aber offenbar nicht so zu sein, oder?!

Mein aktuelles Bsp. dazu sieht so aus:

Header

Code:
class Com_Port
{
	public:

		char Command_Data[20];
		char Msg_Data[20];
		DWORD   BytesRead;
		HANDLE  ComHandle;

		HANDLE Open_Comport (DWORD Comport);
		int Config_ComPort (HANDLE DriverHandle, DWORD BaudRate);
		int Write_Comport (HANDLE DriverHandle);
		int Read_Comport (HANDLE DriverHandle);
		int Close_Comport (HANDLE DriverHandle);
		int Init_ELM (void);
		int Get_Error(void);

		friend AT_Commands (Com_Port *p);

		Com_Port();
		virtual ~Com_Port();

	private:

		char Com_Name[4];
		char szBuf;
		static unsigned int Port_No;
		DWORD DCB_Baud_Rate, Com_Errors;
		DCB   ELM_DCB;
		HANDLE DriverHandle;

};

Implementierung

Code:
#include "Com_Handle.h"

unsigned char CRC(void);
int CreateMsg_Data (char *Msg_Data);

int Com_Port :: Init_ELM (void)
{	
	cout << "Searching ComPort, please wait. \n\n";
	do
	{		
		Port_No ++;
		DriverHandle = Open_Comport (Port_No);
	}
	while(!DriverHandle && Port_No != 5);
	if (!DriverHandle)
	{
		cout << "Unable to open port" << endl;
		return 0;
	}
	cout << "Connected on " << Com_Name << endl;
	Config_ComPort(DriverHandle, 9600);
	ComHandle = DriverHandle; //ComHandle rausschmeißen!
	AT_Commands (this);
	return 0;
}

int AT_Commands (Com_Port *p)
{
	strcpy(p->Command_Data, "atz\r");
	if (!p->DriverHandle)
	{
		cout << "Error" << endl;
		return 0;
	}
	cout << "Performing System Reset . . ." << endl;
	while(p->Command_Data[0] == 'a')
	{
		p->Write_Comport (p->DriverHandle);
		cout << "Enter AT_Command: ";
		cin >> p->Command_Data;
		if(p->Command_Data[0] != 'a')
			break;
		strcat(p->Command_Data, "\r");
	}
	return 0;
}

int CreateMsg_Data(char *Msg_Data)
{
	int i = toascii(Msg_Data[0]); //im Folgenden nur Datenfeld erzeugen 
	int j = 0;
	for(i; i>=0;i--)
	{
		Msg_Data[j] = Msg_Data[j+1];
		j++;
		if(i==0)
			Msg_Data[j] = '\0';
	}//Datenfeld mit Raw-Daten des Bus
	return 0;
}

unsigned char CRC(void) //Berechne Checksumme 
{
	unsigned char msg_buf[20], nBytes=0;
	unsigned char CRC_Reg=0xFF;
	unsigned char poly,i,j;
	unsigned char *Byte_point, Bit_point;

	for (i=0, Byte_point=msg_buf; i<nBytes; i++, Byte_point++)
	{
		for (j=0, Bit_point=0x80 ; j<8; j++, Bit_point>>=1)
		{
			if (Bit_point & *Byte_point)
			{
				if (CRC_Reg & 0x80)
					poly=1;

				else
					poly=0x1C;

				CRC_Reg= ( (CRC_Reg << 1) | 1)^poly;
			}
			else
			{
				poly=0;

				if (CRC_Reg & 0x80)
					poly=0x1D;

				CRC_Reg= (CRC_Reg << 1)^poly;
			}
		}
	}
	return ~CRC_Reg; //Komplement zurückgeben
}

Ich hatte vor über die Funktion int AT_Commands (Com_Port *p) auf die Lese respektive Schreibfunktionen zu zugreifen, Probleme bereitet aber der HANDLE. Alle jetzt als private: deklarierten Elemente waren vorher protected:, ist eigentlich auch nicht weiter schlimm. Ich wollte halt nur wissen, WIESO damit kein Zugriff möglich ist.

Ich bin mir eigentlich sicher, dass dieselben Rechte wie für private: gelten. Aber warum gehts dann nicht?!

Danke schonmal für die Antwort!

MFG
 
Hi,
also dafür sind Friend Funktionen eigentlich gemacht um den
Zugriff auf private Datenelemente einer Klasse X zu ermöglichen, natürlich
auch die Hierarchie "aufwärts" (public, protected).
Das einzigste was ich sehe ist das die Funktion AT_Commands
keinen Rückgabewert in der Funktiondeklaration besitzt.
Ausserdem hast du deine static member nicht initialisiert und dir fehlen
einige Funktionsimplementationen so das dir der Linker wahrscheinlich auch ne Fehlermeldung um die Ohren hauen wird.

Wenn du vielleicht mal die Fehlermeldungen posten könntest könnte man dir
vielleicht genauer helfen....

Gruß

RedWing
 
Hallo RedWing!

Danke für deine Antwort!

xxxalso dafür sind Friend Funktionen eigentlich gemacht um den
Zugriff auf private Datenelemente einer Klasse X zu ermöglichen, natürlich
auch die Hierarchie "aufwärts" (public, protected).xxx

Jo, so dachte ich auch ... ;)

xxxDas einzigste was ich sehe ist das die Funktion AT_Commands
keinen Rückgabewert in der Funktiondeklaration besitzt.xxx

Danke, das habe ich in der Tat übersehen. Fehlermeldung gab's deswegen aber nicht.

xxxAusserdem hast du deine static member nicht initialisiert und dir fehlen
einige Funktionsimplementationen so das dir der Linker wahrscheinlich auch ne Fehlermeldung um die Ohren hauen wird.xxx

Nee, mach dir mal keine Sorgen! :) Habe nur den essentiellen Teil für die Frage gepostet. Der Rest steht in anderen Dateien.

xxxWenn du vielleicht mal die Fehlermeldungen posten könntest könnte man dir
vielleicht genauer helfen....xxx

Aber gerne doch: Die einzigste Fehlermeldung die es gab war halt "Compiler-Fehler C2248".

Ich habe das Problem aber mitlerweile schon entdeckt. Also ein Problem war's eigentlich gar nicht. Nach dem ich alles neu Compiliert habe, ist der Fehler verschwunden. Vermutlich hab ich da vorher beim Probieren noch was geändert und das hat den Fehler verursacht.

Jetzt klappts, auch mit protected:! Habe ich mich ja doch nicht geirrt, wie du ebenfalls bestätigt hast!

Danke nochmal!

Gruß aus FFM
 
Zurück