Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Error:невозможно обратится к private члену 
:(
    Опции темы
CallMeArt
Дата 25.6.2011, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.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 &)"


кто может подсказать в чём проблема?
компилятор visual studio 2010
PM MAIL   Вверх
Cheloveck
Дата 25.6.2011, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата(CallMeArt @  25.6.2011,  11:38 Найти цитируемый пост)

кто может подсказать в чём проблема?

Тебе компилятор всё сказал, даже по-русски! Оператор присваивания объявлен приватным, значит копирование объектов класса запрещено, создание потомков тоже запрещено.


--------------------
user posted image
PM Jabber   Вверх
CallMeArt
Дата 25.6.2011, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.2011

Репутация: нет
Всего: нет



у меня есть класс, который тоже наследуется от стандартного CAsyncSocket и с ним всё впорядке

Код

#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);
};



и в нём не выбивает никаких ошибок
PM MAIL   Вверх
Cheloveck
Дата 25.6.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Что написано в

Цитата(CallMeArt @  25.6.2011,  11:38 Найти цитируемый пост)
c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxsock.h(105)

и
Цитата(CallMeArt @  25.6.2011,  11:38 Найти цитируемый пост)
c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxsock.h(100)
 ?


Это сообщение отредактировал(а) Cheloveck - 25.6.2011, 15:35


--------------------
user posted image
PM Jabber   Вверх
CallMeArt
Дата 25.6.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.2011

Репутация: нет
Всего: нет



Код

private:
        void operator=(const CAsyncSocket& rSrc);  // no implementation

PM MAIL   Вверх
Cheloveck
Дата 25.6.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Вот и всё, наследовать это нельзя. Почему работает твой первый класс - не знаю, скорее всего, ты его не используешь. Смотри в сторону композиции через агрегацию.


--------------------
user posted image
PM Jabber   Вверх
CallMeArt
Дата 25.6.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.2011

Репутация: нет
Всего: нет



2ой класс использую, и довольно таки успешно
как я понял вся проблема в том, что нельзя использовать оператор присвоения
у меня в переменной 
Код

  CFtpSock *m_pControlSocket;

хранится экземпляр класса CFtpSock, из которого был вызван конструктор CDataSocket
то есть  СDataSocket я использую через СFtpSock 
и конструктор у меня выглядит следующим образом
Код

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;
}


и я думаю что здесь то оно и ругается
PM MAIL   Вверх
CallMeArt
Дата 25.6.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.2011

Репутация: нет
Всего: нет



всё проблема решена

там всё было из за CFtpSock
я там переменную типа CDataSocket объявлял при помощи #include "datasocket.h" 
надо же было без include сделать следующим образом

Код

class CDataSocket;
class CFtpSock : public CSocket
{/*-------------*/}


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

CDataSocket *m_pDataSocket;


и всё
незнаю как оно работает, но главное что работает smile
PM MAIL   Вверх
baldina
Дата 25.6.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Cheloveck @  25.6.2011,  16:12 Найти цитируемый пост)
Вот и всё, наследовать это нельзя.

почему же? нельзя копировать, но не наследовать.

Цитата(CallMeArt @  25.6.2011,  16:36 Найти цитируемый пост)
и я думаю что здесь то оно и ругается 

не здесь. копирование указателей на объект это не копирование объекта. ищи в другом месте.
но вообще следует использовать инициализацию членов до тела конструктора

Цитата(CallMeArt @  25.6.2011,  16:36 Найти цитируемый пост)
код C++
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;
}


Код

CDataSocket::CDataSocket(CFtpSock *pSocket)
    : m_nStatus(0)
    ,m_bConnected(false)
    ,m_pControlSocket(pSocket)
    ,m_nTotalBytesSend(0)
    ,m_nTotalBytesTransfered(0)
{
}


в этом случае используется конструктор копирования, а не оператор присваивания
см. http://codepad.org/JThl6CVy
PM MAIL   Вверх
Cheloveck
Дата 25.6.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата(baldina @  25.6.2011,  16:59 Найти цитируемый пост)

почему же? нельзя копировать, но не наследовать.

Да, извиняюсь, нельзя наследовать с автоматической генерацией оператора присваивания


--------------------
user posted image
PM Jabber   Вверх
xvr
Дата 25.6.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(CallMeArt @  25.6.2011,  16:59 Найти цитируемый пост)
незнаю как оно работает, но главное что работает 

Оно работает до тех пор, пока вы не захотите сделать так -
Код

CFtpSock s1, s2;

s1=s2;


Вопрос явно размещен в неподходящем разделе smile

PM MAIL   Вверх
CallMeArt
Дата 27.6.2011, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.6.2011

Репутация: нет
Всего: нет



Почему же не будет работать? 
Я при инициализации сразу же присваиваю переменной ссылку на другой объект такого же типа
и всё работает великолепно
PM MAIL   Вверх
xvr
Дата 27.6.2011, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(CallMeArt @  27.6.2011,  00:16 Найти цитируемый пост)
и всё работает великолепно 
Угу, до тех пор, пока вы не начнете эти объекты уничтожать (точнее они сами начнут это делать, когда выйдут из области видимости). Первый объект при уничтожении удалит свой m_pDataSocket, а второй попытается удалить свой m_pDataSocket, где и сломается. Т.к. оба объекта ссылаются на один и тот же экземпляр CDataSocket, т.к. при копировании объектов были просто скопированы ссылки, но не созданы новые копии объектов CDataSocket  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0882 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.