Klassen-Instanz global/Headerübergreifend verfügbar machen

thekiller

Viceinator
Hallo,

gibt es eine Möglichkeit eine Klasseninstanz in jeder Headerdatei verfügbar zu machen ohne sie global zu deklarieren?
Ich möchte ein Modul für Netzwerkarbeit entwickeln und es als Klasse verpacken. Nunja, da ich bestimmte Methoden in verschiedenen Teilen meines Programms benötige brauch ich die Klasse am besten global.

Ich habe zwar folgende Möglichkeit entdeckt, aber diese wirft mir ein anderes Problem auf wo ich keine Lösung für finde. Und zwar, dass AfxSockInit() ja vor der ersten Deklaration von CSocket aufgerufen werden muss...

C++:
// MFCSocket.h
#ifndef _MFCSOCKET_H
#define _MFCSOCKET_H

#include "afxsock.h"

class MFCSocket {
	private: 
		UINT	uiPort;
	
	public:
		CSocket	SocketInstance;
		CSocket	ConnectionInstance;
		
		MFCSocket();
		~MFCSocket();
		
		BOOL	OpenServer(UINT _uiPort);
		void	Close();
};

extern	MFCSocket	MFCSocketInstance;

#endif

C++:
// MFCSocket.cpp
#include "stdafx.h"
#include "MFCSocket.h"

MFCSocket::MFCSocket() {
	this->uiPort	= 50000;
}

MFCSocket::~MFCSocket() {
	this->SocketInstance.close();
	this->ConnectionInstance.close();
}

BOOL	MFCSocket::OpenServer(UINT	_uiPort) {
	this->uiPort	= _uiPort;

	this->SocketInstance.Create(this->uiPort);
	this->SocketInstance.Bind(this->uiPort);
	this->SocketInstance.Listen();
	this->SocketInstance.Accept(this->ConnectionInstance);
	
	return true;
}

void	MFCSocket::Close() {
	this->SocketInstance.close();
	this->ConnectionInstance.close();
}

MFCSocket	MFCSocketInstance;

Ich hab den Code jetz nich getestet aber is auch nur damit Ihr wisst was ich meine.
Na jedenfalls MFCSocketInstance kann ich zwar global überall verwenden aber AfxSockInit(); kann ich so ja nicht vor der Deklaration von SocketInstance und ConnectionInstance aufrufen und damit wird die Klasse unbrauchbar.
Hoffe Ihr könnt mir helfen.

LG Manu
 
Zuletzt bearbeitet von einem Moderator:

MCoder

Erfahrenes Mitglied
Hallo, du könntest CSocket als Zeiger deklarieren und die Instanz im Konstruktor erst nach dem Aufruf von AfxSockInit() erzeugen.
C++:
// h

class MFCSocket {

    ...
    
    public:
        CSocket *pSocketInstance;
        CSocket *pConnectionInstance;

    ...
        
}; 
 
// cpp

MFCSocket::MFCSocket() {
    
    AfxSockInit();
    
    pSocketInstance     = new CSocket;
    pConnectionInstance = new CSocket;

    this->uiPort    = 50000;
}
 
MFCSocket::~MFCSocket() {
    pSocketInstance->close();
    pConnectionInstance->close();
    
    delete pSocketInstance;
    delete pConnectionInstance;
}
Gruß
MCoder
 

Neue Beiträge