#pragma once
// конечный объект команды DataSocket
enum
{
STATUS_IDLE = 0,
STATUS_LIST = 1,
STATUS_UPLOAD = 2,
STATUS_DOWNLOAD = 3,
};
class CFtpSock;
class CDataSocket : public CAsyncSocket
{
public:
CDataSocket(CFtpSock *pSocket);
virtual ~CDataSocket();
bool m_bConnected;
void SendFile(LPCTSTR lpszFilename);
void RetrieveFile(LPCTSTR lpszFilename);
void SendListing(LPCTSTR lpszListing);
virtual void OnSend(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnAccept(int nErrorCode);
public:
int Receive();
// upload,donwload,list
int m_nStatus;
bool PrepareReceiveFile(LPCTSTR lpszFilename);
bool PrepareSendFile(LPCTSTR lpszFilename);
DWORD m_nTotalBytesTransfered;
DWORD m_nTotalBytesReceive;
DWORD m_nTotalBytesSend;
CFile m_File;
CString m_strListing;
CFtpSock *m_pControlSocket;
};
Error:невозможно обратится к private члену
есть класс, наследуемый от CAsyncSocket
обьявляю его так
Код:
при компиляции выдаёт такую ошибку
Код:
error C2248: CAsyncSocket::operator =: невозможно обратиться к private член, объявленному в классе "CAsyncSocket"
c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxsock.h(105): см. объявление "CAsyncSocket::operator ="
c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxsock.h(100): см. объявление "CAsyncSocket"
Сообщение диагностики возникло в созданной компилятором функции "CDataSocket &CDataSocket::operator =(const CDataSocket &)"
c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxsock.h(105): см. объявление "CAsyncSocket::operator ="
c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxsock.h(100): см. объявление "CAsyncSocket"
Сообщение диагностики возникло в созданной компилятором функции "CDataSocket &CDataSocket::operator =(const CDataSocket &)"
из за чего вообще эрор мог появится?
и что мне с ним делать, а то у меня уже вообще руки опускаются
компилятор vs2010
из за чего вообще эрор мог появится?
[/QUOTE]
Из-за того, что operator=() в CAsyncSocket объявлен как private.
[QUOTE=CallMeArt]
и что мне с ним делать
[/QUOTE]
Перегрузить operator=() в производном классе и дать ему public-доступ. Посмотрите, как он объявлен в afxsock.h:
Код:
private:
void operator=(const CAsyncSocket& rSrc); // no implementation
void operator=(const CAsyncSocket& rSrc); // no implementation
Цитата:
Перегрузить operator=() в производном классе и дать ему public-доступ.
можно пример как это сделать?
Код:
class CDataSocket : public CAsyncSocket
{
public:
CDataSocket(CFtpSock *pSocket);
virtual ~CDataSocket();
bool m_bConnected;
void SendFile(LPCTSTR lpszFilename);
void RetrieveFile(LPCTSTR lpszFilename);
void SendListing(LPCTSTR lpszListing);
virtual void OnSend(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnAccept(int nErrorCode);
void operator=(const CDataSocket&);
public:
int Receive();
// upload,donwload,list
int m_nStatus;
bool PrepareReceiveFile(LPCTSTR lpszFilename);
bool PrepareSendFile(LPCTSTR lpszFilename);
DWORD m_nTotalBytesTransfered;
DWORD m_nTotalBytesReceive;
DWORD m_nTotalBytesSend;
CFile m_File;
CString m_strListing;
CFtpSock *m_pControlSocket;
};
void CDataSocket::operator=(const CDataSocket& sock) {
m_bConnected = sock.m_bConnected;
// ... и все подобные операции копирования
}
{
public:
CDataSocket(CFtpSock *pSocket);
virtual ~CDataSocket();
bool m_bConnected;
void SendFile(LPCTSTR lpszFilename);
void RetrieveFile(LPCTSTR lpszFilename);
void SendListing(LPCTSTR lpszListing);
virtual void OnSend(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnAccept(int nErrorCode);
void operator=(const CDataSocket&);
public:
int Receive();
// upload,donwload,list
int m_nStatus;
bool PrepareReceiveFile(LPCTSTR lpszFilename);
bool PrepareSendFile(LPCTSTR lpszFilename);
DWORD m_nTotalBytesTransfered;
DWORD m_nTotalBytesReceive;
DWORD m_nTotalBytesSend;
CFile m_File;
CString m_strListing;
CFtpSock *m_pControlSocket;
};
void CDataSocket::operator=(const CDataSocket& sock) {
m_bConnected = sock.m_bConnected;
// ... и все подобные операции копирования
}
чуть позже отпишу что получилось :o
куча ошибок, гремит, кречит, ругается и т.д.
мне кажется, что все проблемы из-за
Код:
CFtpSock *m_pControlSocket;
CFtpSock - тоже класс, наследуемый от CAsyncSocket. В этом классе я и вызываю конструктор класса CDataSocket. m_pControlSocket - экземпляр класса CFtpSock, из которого и был вызван конструктор CDataSocket
то есть вот как то так :
конструктор
Код:
CDataSocket::CDataSocket(CFtpSock *pSocket)
: m_nStatus(0)
{
m_bConnected=false;
m_pControlSocket = pSocket;
m_strListing = "";
m_File.m_hFile = NULL;
m_nTotalBytesSend = 0;
m_nTotalBytesTransfered = 0;
}
: m_nStatus(0)
{
m_bConnected=false;
m_pControlSocket = pSocket;
m_strListing = "";
m_File.m_hFile = NULL;
m_nTotalBytesSend = 0;
m_nTotalBytesTransfered = 0;
}
вызов конструктора из CFtpSock
Код:
bool CFtpSock::CreateDataConnection(void)
{
/*--------------------------*/
CDataSocket m_pDataSocket(this);
/*-------------------------*/
}
{
/*--------------------------*/
CDataSocket m_pDataSocket(this);
/*-------------------------*/
}
m_pDataSocket объявлен в классе как
Код:
public:
CDataSocket m_pDataSocket;
CDataSocket m_pDataSocket;
и с ним никаких проблем нету
может я где то перестарался
и теперь царит хаос
Код:
#pragma once
#include "datasocket.h"
// конечный объект команды CFtpSock
class CFtpSock : public CAsyncSocket
{
public:
CFtpSock();
virtual ~CFtpSock();
private:
CDialog * m_pWnd;
public:
void SetParent(CDialog* pWnd);
protected:
virtual void OnAccept(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
public:
int ChooseFunction(CString str);
void NoParamFunction(int iParam);
void ParamFunction(int iParam, CString strParam);
void SendResponse(CString strMsg);
private:
bool bUser;
bool bPass;
public:
int iPort;
public:
int iPort2;//remote port
// тип передачи данных. 1=A (текстовый); 0=I(бинарный)
bool bTypeA;
CString strPath;
CDataSocket m_pDataSocket;
bool CreateDataConnection(void);
bool DestroyDataConnection(void);
bool m_bPassiveMode;
CString m_strRemoteHost;
bool GetDirectoryList(LPCTSTR lpszDirectory, CString &strResult);
};
#include "datasocket.h"
// конечный объект команды CFtpSock
class CFtpSock : public CAsyncSocket
{
public:
CFtpSock();
virtual ~CFtpSock();
private:
CDialog * m_pWnd;
public:
void SetParent(CDialog* pWnd);
protected:
virtual void OnAccept(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
public:
int ChooseFunction(CString str);
void NoParamFunction(int iParam);
void ParamFunction(int iParam, CString strParam);
void SendResponse(CString strMsg);
private:
bool bUser;
bool bPass;
public:
int iPort;
public:
int iPort2;//remote port
// тип передачи данных. 1=A (текстовый); 0=I(бинарный)
bool bTypeA;
CString strPath;
CDataSocket m_pDataSocket;
bool CreateDataConnection(void);
bool DestroyDataConnection(void);
bool m_bPassiveMode;
CString m_strRemoteHost;
bool GetDirectoryList(LPCTSTR lpszDirectory, CString &strResult);
};
Покажите вашу реализацию operator=(). Скорее всего, вы просто еще какие-то приватные члены дергаете.
Всё было из за CFtpSocket
Для того, что бы объявить переменную типа CDataSocket я подключал
Код:
include "datasocket.h"
и переменную объявлял не как ссылку ( CDataSocket m_pDataSocket; )
надо же было делать так как и в CDataSocket, то есть добавить
Код:
class CDataSocket;
class CFtpSock : public CSocket
{/*-------------*/}
class CFtpSock : public CSocket
{/*-------------*/}
и переменную объявить как ссылку
Код:
CDataSocket *m_pDataSocket;
и всё стало на свои места :o