Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Странный эффект наследования....


Автор: En_t_end 20.10.2005, 16:00
Почему нельзя обращаться к public и protected структурам - членам базового класса из методов потомков ? Именно к структурам... очень странно.

Автор: Дрон 20.10.2005, 16:02
En_t_end
Блин... Ну ты же опытный участник, неужели сложно кусок кода в пример привести?

А то я не понимаю, что значит "обращаться к структурам"?

Автор: En_t_end 20.10.2005, 16:05
Ладно...
Код

bool LSockListen::Listen(const char *IP, const unsigned long PORT)
{
    closesocket(sock);
    addr.sin_addr = AF_INET;
    addr.sin_addr.S_un.S_addr = inet_addr(IP);
    addr.sin_port = htons(PORT);
    if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
        return false;
    if((sock = bind(sock, (sockaddr*)&addr, sizeof(sockaddr_in))) == SOCKET_ERROR)
        return false;
    if(listen(sock, 1) == SOCKET_ERROR)
        return false;
    return true;
}

если LSockListen - потомок LSocket, в котором обьявлена public:
sockaddr_in addr;

Автор: Дрон 20.10.2005, 16:06
En_t_end
Издеваешься? smile

Структуру классов с наследованием покажи.
Добавлено @ 16:07
Короче, 50% на то, что у тебя тип наследования не указан -- а по умолчанию он private.

Автор: En_t_end 20.10.2005, 16:08
Код

class LSocket
{
public:
    LSocket();
    ~LSocket();
protected:
    WSADATA wsd;
public:
    SOCKET sock;
    sockaddr_in addr;
    bool IsAddZero;

    friend LSocket& operator <<(LSocket &LSocket,const char* message);
    friend LSocket& operator >>(LSocket &LSocket,char* buffer);
};

class LSock_fnew : public LSocket
{
public:
    unsigned long file_buf_size;
    bool SendFile(const char *Path);
    bool RecvFile(const char *Path);
};

class LSockListen : public LSock_fnew
{
public:
    bool Listen(const char *IP, unsigned long PORT);
    void Accept_atom(LSocket &sock_cl);
};

class LSockJoin : public LSock_fnew
{
public: 
    bool Connect(const char *IP, const unsigned long PORT);
};

Автор: Дрон 20.10.2005, 16:11
Хмм...
Проблем быть не должно. К сожалению сейчас не могу проверить.

Автор: En_t_end 20.10.2005, 16:13
Цитата

Lsock.cpp(96) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
Lsock.cpp(98) : warning C4244: 'argument' : conversion from 'const unsigned long' to 'u_short', possible loss of data
Lsock.cpp(118) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
Lsock.cpp(120) : warning C4244: 'argument' : conversion from 'const unsigned long' to 'u_short', possible loss of data

Вот как ругается компилятор.... на предыдущий кусок кода.

Автор: LPBOY 20.10.2005, 16:14
Компилятор что говорит? smile
Добавлено @ 16:15
Понятно... smile

Автор: Дрон 20.10.2005, 16:15
En_t_end
Точно издеваешься! smile smile smile

Причём здесь наследование?!

Покажи 96 и 118 строки.

Автор: En_t_end 20.10.2005, 16:16
LPBOY
Цитата(LPBOY @ 20.10.2005, 20:14)
Понятно...

Что ?
Блин... что-то мне подсказывает, что я туплю, но вот где, как всегда не понятно smile

Автор: LPBOY 20.10.2005, 16:17
Покажи еще определение sockaddr_in.

Автор: En_t_end 20.10.2005, 16:18
Дрон
Не издеваюсь... показал я их уже(96 - это тот метод Listen, 118 - это аналогичная операция в методе Connect.)

Автор: Дрон 20.10.2005, 16:20
En_t_end

Исправь на
Код

        addr.sin_family = AF_INET;


Кто-нибудь, пристрелите меня! smile smile smile smile smile

Автор: En_t_end 20.10.2005, 16:21
Цитата(LPBOY @ 20.10.2005, 20:17)
определение

Это структура из стандартной библиотеки сокетов smile
Цитата

struct sockaddr_in {
        short  sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

Автор: maxim1000 20.10.2005, 16:22
addr.sin_addr = AF_INET...

Автор: En_t_end 20.10.2005, 16:25
Дрон
Извините smile, я же говорю - туплю... перекодил блин.

Автор: LPBOY 20.10.2005, 16:28
Нда... smile Наследование - опасная штука. smile

Автор: En_t_end 20.10.2005, 16:29
А про наследование подумал потому, что по понятным причинам IDE не смогла мне назвать тип addr, вот я и ступил, что она его просто не может обнаружить в соотвественной области видимости данную структуру из-за коряво реализованного(мной) наследования.

Автор: Дрон 20.10.2005, 16:31
Цитата(En_t_end @ 20.10.2005, 17:29)
А про наследование подумал потому, что по понятным причинам IDE не смогла мне назвать тип addr, вот я и ступил, что она его просто не видит из-за коряво реализованного(мной) наследования.

Не стоит полностью полагаться на IDE. Я сам, когда с сокетами писал -- столкнулся, что эта структура как-то не переваривается, но есть и более хитрые примеры, когда лучше думать своей головой smile

Что-то я сегодня какой-то нервный smile smile

Автор: En_t_end 20.10.2005, 16:32
Тему надо в юмор... smile

Автор: LPBOY 20.10.2005, 16:35
А что на форуме есть "Юмор"? Что же вы молчали? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)