Переход из https://forum.antichat.ru/showpost.php?p=1302836&postcount=234 Гугл подсказал, что для динамической линковки нужно указать параметр -dynamic либо -rdynamic. Размер не изменился, а rdynamic линкер вообще не узнал:
Для динамической линковки нужны .dll либы, которых видимо нету поэтому компилятор автоматически собирает статически
есть класс с несколькими свойствами типа int date; int minute; и тп необходимо реализовать методы для инкремента/декремента этих свойств. я знаю как перегрузить операторы самого класса, но как грамотно сделать методы для каждого свойства? что-то типа DateTime obj; obj.date++; obj.minute--; так вообще можно сделать? или надо писать стопку методов, типа void hourInc(); void hourDec(); ...
Можно реализовать два метода, один на инкримент и один на декримент, и передавать в них типа флага который показывал бы над чем надо сделать inc/dec, например: Code: void DataTime::IncDate(int& field) { switch(field) { case 0: date++; break; case 1: minute++; break; ... } } Для большего удобства имена полей можно задефайнить: Code: #define FIELD_DATE 0 #define FIELD_MIN 1 и т.д. И тогда вызывать obj.IncDate(FIELD_DATE); А вообще дело вкуса, можешь и пачку методов написать на каждый атрибут класса)
Code: class m { public : int a; int b; m() {a = 1; b = 1;} }; int main () { m ob; ob.a++; ob.b++; cout << ob.a << " " << ob.b << endl; return 0; } Вообще это небезопасно
Именно. Все атрибуты лучше хранить как protected или private, а доступ к ним предоставлять через соответствующие методы, тк открытость нарушает модель инкапсуляции и обьекты классов по большому счету ничем не отличаются от структур.
хм Помогите разобраться: Code: char * ptr = new char[10]; cin >> ptr; //вводим abcdefghijklmn - 14 символов cout << ptr; //выводит abcdefghijklmn Собственно почему? Ведь размер ptr 10 байт, а выводится 15? Как вводить данные чтобы избежать этого переполнения?
ну перегрузи оператор инкремента. правда это актуально если инкремент логически относится ко всем полям класса. вообще для того и прячут поля, чтобы обращаца к ним через геттеры и сеттеры, так что не изобретай велосипед и делай как все =) может когда нить проперти впаяют в с++, тогда можно будет прозрачно вызывать гетеры и сетеры обращаясь к полям по имени. но имхо это скорее запутает, ибо тогда становится не понятно, когда переменная скрыта, а когда нет.
Хочу средствами С++ авторизоватся на мейл.ру, отловить я все заголовки что отправляет мой браузер я составил запрос.. В ответе на него получаю "302 ok" Ну там маленькая загвоздка, нету строки "location" Пересмотрел я в браузере что отправил мне сервер, строку "location" я нашол. Ну вот не пойму почему когда я запускаю код я ее не получаю? Может куки не получил, и как вообще получать куки с сайтов ? Пмоготи пожалуйста. Что отправил мне сервер, когда я захожу через браузер: Code: Set-Cookie: t=obLAABAAABAAAAAAAAAAAZAAYMxAcA; expires=Mon, 30 Nov 2009 20:32:18 GMT; path=/; domain=.mail.ru Set-Cookie: Mpop=1244061138:77524f5950525b41185c515f541c404d:[email protected]:; expires=Tue, 01 Sep 2009 20:32:18 GMT; path=/; domain=.mail.ru Location: http://win.mail.ru/cgi-bin/checkcookie?id=775b4760627d7e7019050210041850575d4a54495a524f5950525b41185c515f541c404d Код моего клиента: Code: #include <stdio.h> #include <string.h> #include <winsock2.h> #include <windows.h> #include <ctype.h> #define PORT 80 #define SERVERADDR "194.67.57.126" // Адрес сервера #pragma comment(lib, "Ws2_32.lib") //либа int main ( int argc, char* argv [ ] ) { WSADATA wd; char buff[100000]; char buff2[100000]= { "POST /cgi-bin/auth HTTP/1.1\r\n" "Host: win.mail.ru\r\n" "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9) Gecko/2008051206 Firefox/3.0 (.NET CLR 3.5.30729)\r\n" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n "Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n" "Accept-Encoding: gzip,deflate\r\n" "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n" "Keep-Alive: 300\r\n" "Connection: keep-alive\r\n" "Referer: http://win.mail.ru/cgi-bin/login\r\n" "Cookie: Mpop=1244052980:04707c6077015d01190502190a1d0000041850575d4a54495a524f5950525b41185c515f541c404d:[email protected]:; t=obLD1AAAAAAIAAAABAAAAAAAAAAAZAAYMxAcA; mrcu=ED294A236BAD221A30F778B8D75F; c8=TNYmSgAAAAKA3gIAAAAAApAJBAAAAAACgN0CAAAAAAK5dgEAAAAAAsVGAAAAKA1wEAAAAAApF6AQAAAAACYCIBAAAAAAH5UgEAAAAA; c0=P+oHTAAAAAJZdAwAAAAA; p=i9mYAJpP+QAA; VID=1TUY9324cAme\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: 79\r\n\r\n" "page=&post=&login_from=&Login=login&Domain=mail.ru&Password=pass" }; printf ( "TCP Client \n" ); // ну, тут и так понятно if ( WSAStartup ( 0x202, &wd ) ) { printf ( " WSAStart error %d \n ", WSAGetLastError ( ) ); return -1; } SOCKET sock ; sock=socket ( AF_INET, SOCK_STREAM, 0 ); if ( sock < 0 ) { printf (" Socket ( ) error %d \n ", WSAGetLastError ( ) ); return -1; } sockaddr_in dest_addr; dest_addr.sin_family=AF_INET; //инет коннектинг dest_addr.sin_port=htons ( PORT ); //порт HOSTENT *hst; // хост if( inet_addr(SERVERADDR) != INADDR_NONE ) dest_addr.sin_addr.S_un.S_addr = inet_addr(SERVERADDR); else if( hst=gethostbyname ( SERVERADDR ) ) ( ( unsigned long * ) &dest_addr.sin_addr )[0]=((unsigned long** )hst->h_addr_list)[0][0]; else { printf( "invalid address %s \n", SERVERADDR ); closesocket( sock ) ; WSACleanup(); return -1; } if(connect( sock, (sockaddr *)&dest_addr, sizeof(dest_addr) )) { printf (" Connect error %d \n ", WSAGetLastError ( ) ); return -1; } send( sock, buff2, sizeof(buff2), 0); recv( sock, buff, sizeof(buff)-1, 0 ); printf("%s",buff); printf ("Connection with %s succesfully. quit - quit" , SERVERADDR ); return 0; }
как юзать статическую переменную класса? class DateTime { static int count; // static int count = 0; // incorrect } DateTime:ateTime(): count(0) // incorrect { DateTime::count = 0; // incorrect count = 0; // incorrect } .... DateTime obj; obj::count // incorrect DateTime::count // incorrect как её вообще задать и обращаться к ней внутри класса и снаружи?
нет, мне нужно посчитать в конструкторе сколько раз был создан класс переменную тока инкрементировать и выводить
Code: class some { static int s; }; int some::s = 123; >мне нужно посчитать в конструкторе сколько раз был создан класс Жесть.
Объявляешь в хидере напимер так Code: #pragma once #include <vector> class Worker { public: Worker(void); ~Worker(void); static std::vector<Worker*> workers; }; Дальше в cpp файле того же класса Code: std::vector<Worker*> Worker::workers; Обращаца к статик переменной можно только из статик методов класса. Не, пезжу =) Статик метод не может обращаца к нестатичтным методам. Из нестатик методов же обращение к статик можно. Если обращение извне класса, то юзаешь указание области видимости, например так Code: Worker::workers.push_back(new Worker);