[ 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. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    а где можно взять Ws2_32.lib, чтобы потестить прогу Spy2ex'a?
     
  2. Spy2ex

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

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    В Visual Studio 8 установи и просто подключи.
     
  3. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    Переход из https://forum.antichat.ru/showpost.php?p=1302836&postcount=234

    Гугл подсказал, что для динамической линковки нужно указать параметр -dynamic либо -rdynamic.
    Размер не изменился, а rdynamic линкер вообще не узнал:
     
  4. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Для динамической линковки нужны .dll либы, которых видимо нету поэтому компилятор автоматически собирает статически
     
  5. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    есть класс с несколькими свойствами типа
    int date;
    int minute;
    и тп

    необходимо реализовать методы для инкремента/декремента этих свойств.

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

    DateTime obj;
    obj.date++;
    obj.minute--;

    так вообще можно сделать? или надо писать стопку методов, типа void hourInc(); void hourDec(); ...
     
  6. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    DateTime obj;
    obj.date++;
    obj.minute--;

    Если сделать поля public, то такой способ будет возможен
     
  7. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Можно реализовать два метода, один на инкримент и один на декримент, и передавать в них типа флага который показывал бы над чем надо сделать 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);
    А вообще дело вкуса, можешь и пачку методов написать на каждый атрибут класса)
     
    #3027 razb, 1 Jun 2009
    Last edited: 1 Jun 2009
    1 person likes this.
  8. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    как?? это я и хочу узнать
     
  9. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    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;
    }
    Вообще это небезопасно
     
  10. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Именно. Все атрибуты лучше хранить как protected или private, а доступ к ним предоставлять через соответствующие методы, тк открытость нарушает модель инкапсуляции и обьекты классов по большому счету ничем не отличаются от структур.
     
  11. Lee_fx

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

    Joined:
    27 Sep 2008
    Messages:
    90
    Likes Received:
    14
    Reputations:
    0
    хм

    Помогите разобраться:
    Code:
    char * ptr = new char[10];
    cin >> ptr; //вводим abcdefghijklmn - 14 символов
    cout << ptr; //выводит abcdefghijklmn
    Собственно почему? Ведь размер ptr 10 байт, а выводится 15?
    Как вводить данные чтобы избежать этого переполнения?
     
  12. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Code:
    cin.read(char *buffer, int n) 
     
  13. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    в том то и дело что у меня private :)
     
  14. Ra$cal

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

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    ну перегрузи оператор инкремента. правда это актуально если инкремент логически относится ко всем полям класса. вообще для того и прячут поля, чтобы обращаца к ним через геттеры и сеттеры, так что не изобретай велосипед и делай как все =) может когда нить проперти впаяют в с++, тогда можно будет прозрачно вызывать гетеры и сетеры обращаясь к полям по имени. но имхо это скорее запутает, ибо тогда становится не понятно, когда переменная скрыта, а когда нет.
     
  15. Spy2ex

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

    Joined:
    20 Sep 2008
    Messages:
    32
    Likes Received:
    15
    Reputations:
    1
    Хочу средствами С++ авторизоватся на мейл.ру, отловить я все заголовки что отправляет мой браузер я составил запрос..
    В ответе на него получаю "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;
    
    
    		}
    
     
  16. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    как юзать статическую переменную класса?

    class DateTime
    {
    static int count;
    // static int count = 0; // incorrect
    }

    DateTime::DateTime():
    count(0) // incorrect
    {
    DateTime::count = 0; // incorrect
    count = 0; // incorrect
    }

    ....

    DateTime obj;
    obj::count // incorrect
    DateTime::count // incorrect

    как её вообще задать и обращаться к ней внутри класса и снаружи?
     
  17. Chaak

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

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    А цель статической переменной, чтобы после создания удалилась? Объявляй снаружи тогда уж..
     
  18. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    нет, мне нужно посчитать в конструкторе сколько раз был создан класс
    переменную тока инкрементировать и выводить
     
  19. Fata1ex

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

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Code:
    class some {
    	static int s;	
    };
    
    int some::s = 123;
    
    >мне нужно посчитать в конструкторе сколько раз был создан класс

    Жесть.
     
  20. Ra$cal

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

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Объявляешь в хидере напимер так

    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);
     
    #3040 Ra$cal, 4 Jun 2009
    Last edited: 4 Jun 2009
Thread Status:
Not open for further replies.