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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> при создание класса иногда должно возвращатся NULL 
:(
    Опции темы
Incinerated
Дата 18.2.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

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



Поискав на форуме нашел некоторые вещи, но что то не получается. Вот хеадер класса:
Код

class TWorkWithServer{
private:
  SOCKET sServer;
  SOCKADDR_IN InetAddr;
  WSADATA wsaData;

  TWorkWithServer();
public:
  static TWorkWithServer* Create(char* ip,DWORD port);
  ~TWorkWithServer();
};

а вот cpp:
Код

TWorkWithServer* TWorkWithServer::Create(char* ip,DWORD port){
  if(!WSAStartup(0x0202,&wsaData))
  {
    if((sServer = socket(AF_INET,SOCK_STREAM,0)) != INVALID_SOCKET)
    {
      InetAddr.sin_family      = AF_INET;
      InetAddr.sin_addr.s_addr = inet_addr(ip);
      InetAddr.sin_port        = htons(port);
      if(!connect(sServer,(struct sockaddr *)&InetAddr,sizeof(InetAddr)) != SOCKET_ERROR)
      {
        return NULL;
      }
      else
        return new TWorkWithServer;
    }
    else
      return NULL;
  }
  else
    return NULL;
}

TWorkWithServer::TWorkWithServer(){
}

TWorkWithServer::~TWorkWithServer()
{
}

В cpp-файл не компилится. :( Пишется ошибка [C++ Error] TWorkWithServer.cpp(24): E2034 Cannot convert 'WSAData TWorkWithServer::*' to 'WSAData *'. Я так понимаю нельзя работать с объектами... а что можно сделать?
создаю так:
Код

TWorkWithServer *WorkServer(TWorkWithServer::Create("127.0.0.1",3333));

т.е. смысл такой, если к серверу по заданному ай-пи и порту нельзя подключится, то нужно вернуть NULL при создании экземпляра данного класса. 

Это сообщение отредактировал(а) Incinerated - 18.2.2009, 16:12
PM MAIL   Вверх
Dem_max
Дата 18.2.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот для примера
Код

#include <winsock2.h>
#include <tchar.h>
#include "LIRCserver.h"


//---------------------------------------------------------------------------
bool TWinLIRCServer::Init(void)
{
   WSAData  wsa_data;
   flWSAStartUp = false;
   if(WSAStartup(MAKEWORD(2, 0), &wsa_data)) //  можно вынести в конструктор
   {
      TCHAR Msg[100];
      wsprintf(Msg, _T("An error occurred while loading the network library. Error: %d "), WSAGetLastError());
      MessageBox(0, Msg, _T("Error !!!"), MB_ICONERROR | MB_OK);
      return TRUE;
   }
   return FALSE;
}
//---------------------------------------------------------------------------

int TWinLIRCServer::StartServer(char* IP_Adress, unsigned int Port)
{
   DWORD IP;
   if(!flWSAStartUp) return OTHER_ERROR;

}
//---------------------------------------------------------------------------
void TWinLIRCServer::StopServer(void)
{

}        


TWinLIRCServer::TWinLIRCServer()
{

}

TWinLIRCServer::~TWinLIRCServer()
{

    WSACleanup();
}



Код

#ifndef WINLIRC_SERVER_H
#define WINLIRC_SERVER_H

class TWinLIRCServer
{
   public:
      bool Init(void);
      void UnInit(void);
       int StartServer(char* IP_Adress, unsigned int Port);

   private:
       SOCKET ServerSocket;
       SOCKET ClientSocket;
      SOCKADDR_IN SocketAddress;
      HANDLE hEventServer;
      HANDLE hEventClient;
      HANDLE hThreadServer;
      bool flServerStarted;
      bool flWSAStartUp;
};

#endif



Это сообщение отредактировал(а) Dem_max - 18.2.2009, 16:22


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Lazin
Дата 18.2.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



на какую строчку ругается?
PM MAIL Skype GTalk   Вверх
Incinerated
Дата 18.2.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

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



Цитата(Lazin @ 18.2.2009,  16:22)
на какую строчку ругается?

первую в функции
Код

if(!WSAStartup(0x0202,&wsaData))


to DemMax это я и сам знаю что так можно сделать... а мне нужно чтобы, например, я делаю TWorkWithBase *temp = new TWorkWithBase("127.0.0.1",3333); если не подключилось, вернулось в переменную temp NULL. В некоторых закрытых классах это реализовано, мне нужно знать как...

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


Эксперт
***


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

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



Incinerated, 
Ты лучше бы показал текст ошибки, а то сидий гадай на что ругается.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Incinerated
Дата 18.2.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

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



Цитата(Dem_max @ 18.2.2009,  16:33)
Incinerated, 
Ты лучше бы показал текст ошибки, а то сидий гадай на что ругается.

Я писал...в первом посте....
Цитата

Пишется ошибка [C++ Error] TWorkWithServer.cpp(24): E2034 Cannot convert 'WSAData TWorkWithServer::*' to 'WSAData *'

PM MAIL   Вверх
Lazin
Дата 18.2.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



у gcc какие-то загадочные сообщения об ошибках smile 
Create - статический метод класса, а ты пытаешься получить из него доступ к нестатическим членам класса
PM MAIL Skype GTalk   Вверх
Dem_max
Дата 19.2.2009, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



кстати незаметил, а зачем ты Create(char* ip,DWORD port); делаешь статическим ?


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 19.2.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Dem_max @  19.2.2009,  08:36 Найти цитируемый пост)
кстати незаметил, а зачем ты Create(char* ip,DWORD port); делаешь статическим ? 

Цитата(Incinerated @  18.2.2009,  14:48 Найти цитируемый пост)
смысл такой, если к серверу по заданному ай-пи и порту нельзя подключится, то нужно вернуть NULL при создании экземпляра данного класса. 


хотя, имхо, конструкция не очень удачная...

Это сообщение отредактировал(а) mes - 19.2.2009, 10:09


--------------------
PM MAIL WWW   Вверх
SenkraD
Дата 19.2.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



Цитата(Dem_max @  19.2.2009,  09:36 Найти цитируемый пост)
кстати незаметил, а зачем ты Create(char* ip,DWORD port); делаешь статическим ?
Я так полагаю что  это паттерн фабричный метод.
Тогда измени свой метод так:
Код

TWorkWithServer* TWorkWithServer::Create(char* ip,DWORD port){
TWorkWithServer* newServer = new TWorkWithServer();
try
{
    if(!WSAStartup(0x0202,&newServer->wsaData))
    {
          throw;
    }
    
    if((newServer->sServer = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
    {
         throw;
    }
  
    newServer->InetAddr.sin_family      = AF_INET;
    newServer->InetAddr.sin_addr.s_addr = inet_addr(ip);
    newServer->InetAddr.sin_port        = htons(port);
    if(!connect(newServer->sServer,(struct sockaddr *)&newServer->InetAddr,sizeof(InetAddr)) != SOCKET_ERROR)
    {
         throw;
    }
} catch (...)
{
        delete newServer;
        newServer = NULL;
}
return newServer;


Плюс ексепшины можен нормальные кидать и обрабатывать их
Ну и ещё можно было бы часть переделать, но это уже думай сам

Это сообщение отредактировал(а) SenkraD - 19.2.2009, 10:15


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Incinerated
Дата 19.2.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

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



всем спасибо, а еще вопрос.... возможно ли такое сделать без отдельной функции Create? Чтобы где то в коде через new создавался экземпляр класса и если что-то не так в конструкторе, то возвращался бы NULL? Или только таким способом можно?
Спасибо.
PM MAIL   Вверх
mes
Дата 19.2.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Incinerated @  19.2.2009,  10:15 Найти цитируемый пост)
возможно ли такое сделать без отдельной функции Create? Чтобы где то в коде через new создавался экземпляр класса и если что-то не так в конструкторе, то возвращался бы NULL? 

нет, только разгрузив внешней (по отношению к создаваемому объекту) функцией. 

только вот Вы абсолютно уверены, что в случае отсутствия связи должен возвращаться NULL вместо объекта-сервера ?  

Это сообщение отредактировал(а) mes - 19.2.2009, 11:28


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


Шустрый
*


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

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



Код

operator new


Это сообщение отредактировал(а) GSasha - 19.2.2009, 12:20
PM MAIL ICQ   Вверх
Incinerated
Дата 19.2.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

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



Цитата(mes @ 19.2.2009,  10:23)
только вот Вы абсолютно уверены, что в случае отсутствия связи должен возвращаться NULL вместо объекта-сервера ?

да. А зачем мне объект-сервер, если он ничего сделать не может?!
PM MAIL   Вверх
Dem_max
Дата 19.2.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а в друг в данный момент коннекта нету, а через секунду сервер ответит. Так что лучше создавать экземпляр класса как обычно и иметь функцию Connect


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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