Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Error:невозможно обратится к private члену

68K
25 июня 2011 года
CallMeArt
11 / / 25.06.2011
Доброго времени суток!
есть класс, наследуемый от CAsyncSocket
обьявляю его так

Код:
#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 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 &)"


из за чего вообще эрор мог появится?
и что мне с ним делать, а то у меня уже вообще руки опускаются

компилятор vs2010
278
25 июня 2011 года
Alexander92
1.1K / / 04.08.2008
[QUOTE=CallMeArt]
из за чего вообще эрор мог появится?
[/QUOTE]
Из-за того, что operator=() в CAsyncSocket объявлен как private.

[QUOTE=CallMeArt]
и что мне с ним делать
[/QUOTE]
Перегрузить operator=() в производном классе и дать ему public-доступ. Посмотрите, как он объявлен в afxsock.h:
 
Код:
private:
        void operator=(const CAsyncSocket& rSrc);  // no implementation
68K
25 июня 2011 года
CallMeArt
11 / / 25.06.2011
Цитата:
Перегрузить operator=() в производном классе и дать ему public-доступ.


можно пример как это сделать?

278
25 июня 2011 года
Alexander92
1.1K / / 04.08.2008
Код:
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;
        // ... и все подобные операции копирования
}
68K
25 июня 2011 года
CallMeArt
11 / / 25.06.2011
спасибо, попробую
чуть позже отпишу что получилось :o
68K
25 июня 2011 года
CallMeArt
11 / / 25.06.2011
нет не получается так
куча ошибок, гремит, кречит, ругается и т.д.

мне кажется, что все проблемы из-за
 
Код:
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;
}


вызов конструктора из CFtpSock
 
Код:
bool CFtpSock::CreateDataConnection(void)
{
/*--------------------------*/
    CDataSocket m_pDataSocket(this);
/*-------------------------*/
}


m_pDataSocket объявлен в классе как
 
Код:
public:
CDataSocket m_pDataSocket;


и с ним никаких проблем нету
может я где то перестарался
и теперь царит хаос
68K
25 июня 2011 года
CallMeArt
11 / / 25.06.2011
на всякий случай вот ещё объявление CFtpSock
Код:
#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);
};
278
25 июня 2011 года
Alexander92
1.1K / / 04.08.2008
Покажите вашу реализацию operator=(). Скорее всего, вы просто еще какие-то приватные члены дергаете.
68K
25 июня 2011 года
CallMeArt
11 / / 25.06.2011
Благодарю за время, проблема вроде решена
Всё было из за CFtpSocket
Для того, что бы объявить переменную типа CDataSocket я подключал
 
Код:
include "datasocket.h"

и переменную объявлял не как ссылку ( CDataSocket m_pDataSocket; )

надо же было делать так как и в CDataSocket, то есть добавить
 
Код:
class CDataSocket;
class CFtpSock : public CSocket
{/*-------------*/}

и переменную объявить как ссылку
 
Код:
CDataSocket *m_pDataSocket;


и всё стало на свои места :o
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог