Все что в хэдэре заключи в такую конструкцию: Code: #ifndef _MB_H_ #define _MB_H_ .... #endif /* _MB_H_ */
horlyk ну это простое правило нужно и можно усвоить и без книг. Если ты делаешь класс - снабди его ровно тем поведением, которое будет ожидать от него человек, увидев имя класса. Вот ты делал список - я ожидал там видеть управление данными. Никаких меню. Ожидал что работать буду так List list1; list1.add(name, age); list1.add(name2, age2); list1.remove(name1); list1.sort(); единственный метод, который можно добавить ради простоты - метод view. Хотя на самом деле делается это введением доп класса или снабжением списка например итераторами. Чтобы понять в общем смысле суть представь, что ты купил машину. Но чтобы на ней ехать тебе надо открыть капот, впрыснуть в карбюратор немного бензина, залезть в кпп и добавить шестеренки, отрегулировать дифференциал... Суть - скрыть ВСЕ, что мешает абстракции. Нажал кнопочку - все сделалось само. Сработал стартер, в карбюратор бензин, искра - завелись. Как на самом деле все это работает - тебя не трогает. Плюс делать вещь должна ровно то, о чем говорит название. Врядли ты обрадуешься, если машина помимо езды еще и мусор собирает, и селедку возит. МОжет конечно это тебе и пригодится, но это лишняя сложность. Или называй машину как селедковоз с мусоросборкой, чтобы знать, чего ожидать, или разбей все фичи на отдельные устройства. Так же в программах =) Очень простой признак говняности кода - слишком длинные приготовления для работы с классом. В твоем примере это создание Node'ов при любом действии со списком. Логичнее же все повторяющиеся места пихнуть в класс и оставить только вызов метода. У тебя это не так очевидно ибо список, как уже упоминалось выше, делает помимо управления списком и весь клиентский код
То есть, получается нужно чтобы был создан класс List, в нем были все методы управления списком - добавления, удаления, сортировки и т.д. и объект другого класса, то есть класса Node - голова. Это все вынести в отдельный хедер и из мейна управлять так, как ты и описал: List list1; list1.add(name, age); list1.add(name2, age2); list1.remove(name1); list1.sort(); и открыть для общего доступа только главные, не вспомогательные методы. Следовательно ООП подразумевает простоту использования объектов и их методов для конечного пользователя. Я правильно понял?
угу. это называется инкапсуляция 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 Там же смотри абстракцию.
Во! теперь понял! еще раз огромное спасибо! Ща еще допишу в этой же программе пересчет номеров узлов, тоесть были узлы: узел1, узел2, узел3. Удалили узел2. Узел3 стал узел2. что-то типа этого. После этого, не поленюсь, перепишу полностью программу с нуля, уже думая над инкапсуляцией, используя еще и двухсвязные списки!
Та не за что =) Просто внимательнее книги читай. Эти моменты там обсуждаются 100% Просто их с ходу не понимают обычно.
Нужно написать софт для работы с HTTP. Подскажите какие библиотеки\классы\исходники использовать, что бы упростить себе задачу. Было бы здорово если бы дали ссылки на хорошие статьи\книги и т.д. Заранее спасиб
в общем ладно - сай ошибку найду. --- вобщем посмотрел как это делает автор кода, сделал вот как: 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; } Что это такое не особо понимаю ибо с длл работаю впервые.
Gin, WINSOCK / WININET. ps. я, конечно, могу сейчас открыть google и найти тебе несколько статей, которые читал или отзывы о которых указывают на их хорошее качество, но не понимаю, почему этого не можешь сделать ты.
http://www.citforum.ru/book/cook/winsock.shtml - вариант для Win. Если нужно под UNIX то SOCKET -> int; и не нужно делать никаких инициализация с WSA. closesocket() -> close();
2Fata1ex Конечно я это уже сделал, по WININET я нашел инфу даже книгу, за WINSOCK спасиб не знал. 2Glazz Спасиб за ресур этот я не нашел. 2All Выложил бы кто из сообщества свой пример использования WINSOCK / WININET. К примеру парсинг выдачи гугла или просто получения кода страницы. Что нибуть простое, но показывающее механизмы работы. Большинство же статей что я нашел, расказывается о написание чата или же клиент серверных приложений.
Посмотри эту тему, А вот, например, 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"); } }
2agrofyl2 if( connect(lsocket,(SOCKADDR*)addr,addrLen ) == 0 ) вот в этом куске кода, ошибку выдает помоги плз пишет что cannot convert from 'sockaddr_in' to 'SOCKADDR*' Нашел ошибку правильней if( connect(lsocket,( struct SOCKADDR*)&addr,addrLen ) == 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 вторая книга - я с ее примеров начал работать с винсок
У меня есть 2 класса: LIST и DATA. Я их включаю в отдельный хедер и подключаю в новый проэкт. Как можно сделать так, чтобы пользователь не мог создать объект класса DATA в своем проэкте?
Ну смотри, создал я свой хедер, в нем 2 класса. Далее создаю новый проект и подключаю в него свой хедер. Из хедера должен использоваться только 1 класс - LIST. Я в своем проекте не должен создавать объект класса DATA . То есть не допустить создание нового объекта этого класса пользователем вручную. Как это реализовать? хедер: Code: class DATA { методы... }; class LIST { методы... }; В новом проекте файл срр: Code: LIST mylist;// так можно и нужно DATA mydata;// а вот это я хочу запретить Возможно ли такое сделать?