[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Все что в хэдэре заключи в такую конструкцию:
    Code:
    #ifndef _MB_H_
    #define _MB_H_
    
    ....
    
    #endif  /* _MB_H_  */
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ты проверь, возможно ты файл mb.h пытаешься компилить также как и други cpp файлы
     
  3. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    horlyk
    ну это простое правило нужно и можно усвоить и без книг. Если ты делаешь класс - снабди его ровно тем поведением, которое будет ожидать от него человек, увидев имя класса. Вот ты делал список - я ожидал там видеть управление данными. Никаких меню. Ожидал что работать буду так

    List list1;
    list1.add(name, age);
    list1.add(name2, age2);
    list1.remove(name1);
    list1.sort();
    единственный метод, который можно добавить ради простоты - метод view. Хотя на самом деле делается это введением доп класса или снабжением списка например итераторами.

    Чтобы понять в общем смысле суть представь, что ты купил машину. Но чтобы на ней ехать тебе надо открыть капот, впрыснуть в карбюратор немного бензина, залезть в кпп и добавить шестеренки, отрегулировать дифференциал... Суть - скрыть ВСЕ, что мешает абстракции. Нажал кнопочку - все сделалось само. Сработал стартер, в карбюратор бензин, искра - завелись. Как на самом деле все это работает - тебя не трогает. Плюс делать вещь должна ровно то, о чем говорит название. Врядли ты обрадуешься, если машина помимо езды еще и мусор собирает, и селедку возит. МОжет конечно это тебе и пригодится, но это лишняя сложность. Или называй машину как селедковоз с мусоросборкой, чтобы знать, чего ожидать, или разбей все фичи на отдельные устройства. Так же в программах =)
    Очень простой признак говняности кода - слишком длинные приготовления для работы с классом. В твоем примере это создание Node'ов при любом действии со списком. Логичнее же все повторяющиеся места пихнуть в класс и оставить только вызов метода.
    У тебя это не так очевидно ибо список, как уже упоминалось выше, делает помимо управления списком и весь клиентский код
     
  4. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    То есть, получается нужно чтобы был создан класс List, в нем были все методы управления списком - добавления, удаления, сортировки и т.д. и объект другого класса, то есть класса Node - голова. Это все вынести в отдельный хедер и из мейна управлять так, как ты и описал:
    List list1;
    list1.add(name, age);
    list1.add(name2, age2);
    list1.remove(name1);
    list1.sort();
    и открыть для общего доступа только главные, не вспомогательные методы.
    Следовательно ООП подразумевает простоту использования объектов и их методов для конечного пользователя. Я правильно понял?
     
  5. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    угу. это называется инкапсуляция

    http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

    Там же смотри абстракцию.
     
    #3345 Ra$cal, 29 Jul 2009
    Last edited: 29 Jul 2009
  6. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Во! теперь понял! еще раз огромное спасибо! Ща еще допишу в этой же программе пересчет номеров узлов, тоесть были узлы: узел1, узел2, узел3. Удалили узел2. Узел3 стал узел2. что-то типа этого.

    После этого, не поленюсь, перепишу полностью программу с нуля, уже думая над инкапсуляцией, используя еще и двухсвязные списки!
     
  7. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Та не за что =) Просто внимательнее книги читай. Эти моменты там обсуждаются 100% Просто их с ходу не понимают обычно.
     
  8. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    Нужно написать софт для работы с HTTP. Подскажите какие библиотеки\классы\исходники использовать, что бы упростить себе задачу. Было бы здорово если бы дали ссылки на хорошие статьи\книги и т.д.
    Заранее спасиб
     
  9. agrofyl2

    agrofyl2 New Member

    Joined:
    25 Apr 2008
    Messages:
    54
    Likes Received:
    4
    Reputations:
    0
    в общем ладно - сай ошибку найду.


    ---
    вобщем посмотрел как это делает автор кода, сделал вот как:
    Code:
    void DLLEXPORT GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, glparam* GPE)
    #else
    extern "C" DLLEXPORT GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, glparam* GPE )
    #endif
    {
       memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
       GP=GPE;
    }
    
    Что это такое не особо понимаю ибо с длл работаю впервые.
     
    #3349 agrofyl2, 30 Jul 2009
    Last edited: 30 Jul 2009
  10. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Gin, WINSOCK / WININET.

    ps. я, конечно, могу сейчас открыть google и найти тебе несколько статей, которые читал или отзывы о которых указывают на их хорошее качество, но не понимаю, почему этого не можешь сделать ты.
     
  11. Glazz

    Glazz Elder - Старейшина

    Joined:
    9 Aug 2008
    Messages:
    116
    Likes Received:
    7
    Reputations:
    0
    http://www.citforum.ru/book/cook/winsock.shtml - вариант для Win. Если нужно под UNIX то
    SOCKET -> int;
    и не нужно делать никаких инициализация с WSA.
    closesocket() -> close();
     
    1 person likes this.
  12. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    2Fata1ex

    Конечно я это уже сделал, по WININET я нашел инфу даже книгу, за WINSOCK спасиб не знал.

    2Glazz

    Спасиб за ресур этот я не нашел.

    2All
    Выложил бы кто из сообщества свой пример использования WINSOCK / WININET. К примеру парсинг выдачи гугла или просто получения кода страницы. Что нибуть простое, но показывающее механизмы работы. Большинство же статей что я нашел, расказывается о написание чата или же клиент серверных приложений.
     
  13. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    В разделе "статьи" товарищ slesh уже писал статьи по данному сабжу.
     
  14. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    1 person likes this.
  15. agrofyl2

    agrofyl2 New Member

    Joined:
    25 Apr 2008
    Messages:
    54
    Likes Received:
    4
    Reputations:
    0
    Посмотри эту тему,
    А вот, например, TCP клиент( просто коннект) - потом добавляешь хттп запросы и вперед!

    Code:
    Код:
    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    #define REMOTE_ADDR  "127.0.0.1"
    #define DEF_HTTP_PORT 80
    
    int main(void)
    {
            WSADATA wsd;
            struct sockaddr_in addr;
            
            if( WSAStartup( MAKEWORD(2,2),&wsd ) == 0)
            {
                    puts("WIndows socket interface is loaded");
    
                    addr.sin_addr.s_addr = inet_addr(REMOTE_ADDR);
                    addr.sin_family      = AF_INET;
                    addr.sin_port        = htons(DEF_HTTP_PORT);
                    SOCKET lsocket       = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
                  
                    if( lsocket != -1 )
                    {
                             unsigned int addrLen = sizeof(addr);
                             if( connect(lsocket,(SOCKADDR*)addr,addrLen ) == 0 )
                             {
                                       puts("Connected to server\n");
                             }
                             else
                             {
                                       printf("Error : %d\n", WSAGetLastError());
                             }
                    }
                    else
                    {
                             puts("Could not create socket");
                    }
           }
           else
           {
                    puts("Could not load windows socket interface");
           }
    }
    
     
    1 person likes this.
  16. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    2agrofyl2

    if( connect(lsocket,(SOCKADDR*)addr,addrLen ) == 0 )
    вот в этом куске кода, ошибку выдает помоги плз пишет что
    cannot convert from 'sockaddr_in' to 'SOCKADDR*'

    Нашел ошибку правильней
    if( connect(lsocket,( struct SOCKADDR*)&addr,addrLen ) == 0 )
     
    #3356 Gin, 30 Jul 2009
    Last edited: 30 Jul 2009
  17. agrofyl2

    agrofyl2 New Member

    Joined:
    25 Apr 2008
    Messages:
    54
    Likes Received:
    4
    Reputations:
    0
    Тот код я просто скопировал, не проверял.
    А вот правильный, проверенный, специально для тебя:
    Code:
    #include <winsock2.h> //winsock header
    #pragma comment( lib, "ws2_32.lib" ) //winsock lib
    
    #include "iostream"
    using namespace std;
    
    
    int main()
    {
    	cout << "Work" << endl;
    
    	char servername[]="forum.antichat.net";
    	int port=80;
    
    	//Загружаем ВинСок
     	WSADATA wsd;
    	if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {//проверяем загрузилась ли
    		cout << "Error load winsock2" << endl;
    		return 0;
    	}
    
     	struct sockaddr_in server;
    	struct hostent *host = NULL;
    	SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//Создаем сокет
    	if (sClient == INVALID_SOCKET) {//проверяем, нормально ли создался сокет
    		cout << "Invalid socket" << endl;
    		return 0;
    	}
        
        server.sin_family = AF_INET;
        server.sin_port = htons(port);
        server.sin_addr.s_addr = inet_addr(servername);
    
    	if (server.sin_addr.s_addr == INADDR_NONE) //Если указано имя, а не айпишник
        {
            host = gethostbyname(servername);//пробуем его определить
    		if (host == NULL) {
    			cout << "Can't get IP by hostname..." << endl;
    			return 0;
    		}
            
            CopyMemory(&server.sin_addr, host->h_addr_list[0],host->h_length);
        }
        
    	if (connect(sClient, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) {
    		cout << "Connect filed" << endl;
    		return 0;
    	}
    	//Все, подключились...-----------
    
    	int ret;
    	char zapros[]="GET / HTTP/1.1\r\nHost: forum.antichat.net\r\nConnection: Close\r\n\r\n";
    	
    	ret=send(sClient, zapros, strlen(zapros)+1, 0);//Шлем данные
    	if(ret==SOCKET_ERROR) {
    		cout << "Socket error" << endl;
    		return 0;
    	}
    
    	int stat=1;
    	while(stat) {
    		char get[1024]="";
    		ret=recv(sClient, get, 1024, 0);//Получаем данные
    		cout << get;
    		if(ret==0) stat=0;
    		if(ret==SOCKET_ERROR) {
    			cout << "Socket error" << endl;
    			return 0;
    		}
    			
    	}
    
    	WSACleanup();//Не забываем выгрузить библиотеку
    }
    
    Зайди lstyle.ucoz.ru вторая книга - я с ее примеров начал работать с винсок
     
    #3357 agrofyl2, 31 Jul 2009
    Last edited: 31 Jul 2009
    1 person likes this.
  18. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    У меня есть 2 класса: LIST и DATA. Я их включаю в отдельный хедер и подключаю в новый проэкт. Как можно сделать так, чтобы пользователь не мог создать объект класса DATA в своем проэкте?
     
  19. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    что то я совсем не понял логики твоего вопроса.
     
  20. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Ну смотри, создал я свой хедер, в нем 2 класса. Далее создаю новый проект и подключаю в него свой хедер. Из хедера должен использоваться только 1 класс - LIST. Я в своем проекте не должен создавать объект класса DATA . То есть не допустить создание нового объекта этого класса пользователем вручную. Как это реализовать?

    хедер:
    Code:
    class DATA
    {
        методы...
    };
    
    class LIST
    {
        методы...
    };
    В новом проекте файл срр:
    Code:
    LIST mylist;// так можно и нужно
    DATA mydata;// а вот это я хочу запретить
    Возможно ли такое сделать?
     
    #3360 horlyk, 31 Jul 2009
    Last edited: 31 Jul 2009
Thread Status:
Not open for further replies.