[ 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. Forcer

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

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Меня лично учили так(Дейтелы пишут также): нужно отделять определение(интерфейс) от реализации. В объявлении класса не должна находиться реализация методов. Т.е. внутри определения класса - только прототипы методов. Класс - это конечный программный продукт. Клиентам, которые пользуются классом, совсем не обязательно видеть, как реализованы методы. Им нужно знать какими методами можно воспользоваться и какие результаты будут получены. Поэтому внутри класса методы должны находиться в следующем порядке: сначала public, далее protected, и лишь потом private.
    Цитата из Дейтелов:
    Т.е. для класса создаем 2-а файла: .cpp(с реализацией методов) и .h(с объявлением класса). В свои включаем хедер, проект собираем вместе с файлом .cpp. Это не касается встроенных функций. Они должны находиться в объявлении класса. И ещё нужно использовать директивы препроцессора #ifndef, #define, #endif чтобы не допускать повторного включения заголовочных файлов.

    P.S. Страуструп:
     
    #801 Forcer, 1 Mar 2008
    Last edited: 1 Mar 2008
  2. Meanor

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

    Joined:
    9 Sep 2007
    Messages:
    66
    Likes Received:
    9
    Reputations:
    0
    Спасибо, т.е. все уперается в инкапсюляцию...

    А вот конструкторы и деструкторы описываются в теле класса?
     
  3. Forcer

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

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Нет. Вся реализация, в том числе конструкторов и деструкторов, вне объявления класса. Хотя если вы пишите небольшой класс, возможно и не стоит строго следовать всем канонам, но зато это войдёт у вас в привычку.
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Справедливо только для C++. ИМХО это крайне неправильно(ну в других языках даже такой возможности нет), но если так не делать, появится куча ошибок при создании проекта, когда один класс используется в нескольких.
    Связано с тем, что в С++ нельзя скомпилить файл, не зная прототипов.
     
  5. Shawn1x

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

    Joined:
    24 Aug 2007
    Messages:
    307
    Likes Received:
    538
    Reputations:
    13
    Где можно скачать исходники джойнера на С++?
     
  6. SHLAK

    SHLAK New Member

    Joined:
    10 Dec 2007
    Messages:
    12
    Likes Received:
    4
    Reputations:
    0
    Есть ли у кого нибудь исходники калькулятора на С++?
     
  7. brasco2k

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

    Joined:
    23 Nov 2007
    Messages:
    258
    Likes Received:
    91
    Reputations:
    0
    Помогите написать такой код на C#:
    Чтобы на каждый тик таймера выделялась следующая буква из текстогого поля...
     
  8. Darkor

    Darkor New Member

    Joined:
    3 Feb 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Нужна помощь в C#
    Надо сделать таблицу как в excel'e
    Скажем чтоб было 3 строки и 10 столбцов.
    Подскажите плз.
     
  9. Garfi

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

    Joined:
    1 Feb 2008
    Messages:
    85
    Likes Received:
    23
    Reputations:
    0
    это подходит? :)
     
    1 person likes this.
  10. ForNeVeR

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

    Joined:
    1 May 2006
    Messages:
    67
    Likes Received:
    31
    Reputations:
    0
    Подскажите пожалуйста, как в MS Visual C++ 2008 .NET сделать, чтобы 2 неких .h файла (например, 2 формы) могли получить доступ к классам друг друга? А то делаю в одном #include "file2.h", в другом #include "file1.h" - в итоге классы друг друга они не видят...
     
  11. zythar

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

    Joined:
    16 Feb 2008
    Messages:
    517
    Likes Received:
    109
    Reputations:
    5
    попробуй сделать один хидер там объявить класс. потом этот хидер инклудить в те два хидера.
     
  12. ForNeVeR

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

    Joined:
    1 May 2006
    Messages:
    67
    Likes Received:
    31
    Reputations:
    0
    Дело в том, что в моём случае в одном из этих хидеров и объявлен класс, которому нужен доступ к классу формы, объявленному в другом хидере. Причём источник ошибок для меня совершенно неясен: просто "не виден" в одном файле класс, объявленный в другом. Видимо, это как-то связано именно с тем, что файлы ссылаются друг на друга... Хотя #pragma once стоит в обоих и сообщений о достижении максимальной глубины вложеннности #include'ов (что происходит если её убрать ;) ) не появляется.
     
  13. zythar

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

    Joined:
    16 Feb 2008
    Messages:
    517
    Likes Received:
    109
    Reputations:
    5
    хз.. может че то перепутал при объявлении класса?
    какая ошибка? ну и исходники в студию плз. я особо в с++ не силен, но посмотрим что можно сделать
     
  14. ForNeVeR

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

    Joined:
    1 May 2006
    Messages:
    67
    Likes Received:
    31
    Reputations:
    0
    Исходники длинные, но вот существенные части:
    // CommonClass.h
    #pragma once
    #include "Form1.h"
    //#include "CommonClass.cpp"

    using namespace System;
    // . . .
    using namespace ICQ_client;

    public ref class CommonClass{
    // Объявления методов, параметров и т.д.
    };

    // Form1.h
    #pragma once

    #include "CommonClass.h"

    using namespace System;
    // . . .
    namespace ICQ_client
    {
    public ref class Form1 : public System::Windows::Forms::Form
    {
    // . . .
    CommonClass^ common; // Тут вылазит ошибка C2143: syntax error : missing ';' before '^', т.е. он не понимает, что CommonClass - это название класса.

    //. . .
    };
    }

    Причём если в CommonClass.h не инклудить Form1.h, то в Form1 класс виден. И наоборот, если #include "CommonClass.h" убрать из файла Form1.h, файл CommonClass.h проходится нормально. Была мысль, что что-то напутано с ; , но это кажется маловероятным.
     
    #814 ForNeVeR, 3 Mar 2008
    Last edited: 3 Mar 2008
  15. zythar

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

    Joined:
    16 Feb 2008
    Messages:
    517
    Likes Received:
    109
    Reputations:
    5
    а что у тебя в CommonClass.cpp лежит?
    я чета не видел чтобы cpp файлы инклудили..
     
    1 person likes this.
  16. ForNeVeR

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

    Joined:
    1 May 2006
    Messages:
    67
    Likes Received:
    31
    Reputations:
    0
    Извиняюсь, нечаянно дописал при переносе кода. На самом деле там такого, конечно, нет :)

    Ну и для понимания дао программы действительно нужно: CommonClass.cpp
    #pragma once

    #include "StdAfx.h"
    #include "CommonClass.h"

    using namespace System::Text;
    // . . .
    CommonClass::CommonClass()
    {
    }

    bool CommonClass::flapHeader(...)
    {
    // . . .
    }

    // . . .
     
    #816 ForNeVeR, 3 Mar 2008
    Last edited: 3 Mar 2008
  17. ForNeVeR

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

    Joined:
    1 May 2006
    Messages:
    67
    Likes Received:
    31
    Reputations:
    0
    Ладно, в общем, всё, переделал по-другому, пришлось часть функций класса рассовывать по формам, но вроде (тьфу-тьфу-тьфу) работает. Всё равно +1 за попытку помочь ;)
     
    1 person likes this.
  18. _Sanich

    _Sanich New Member

    Joined:
    11 Feb 2008
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Подскажите пожайлуста как с помощью MS Visual C++ откомпилировать этот исходник..
    С подобным сталкиваюсь первый раз..

    void main()
    {
    // Объявим переменные, необходимые для работы
    HWND hManForm,hGroupBox,hEdit,hComboBox; // Идентификаторы форм
    char* pUIN; // Указатель на буфер для UIN
    char* pPass; // Указатель на буфер для пароля
    int iUIN; // Длина UIN
    int iPass; // Длина пароля

    // Найдем окно диалога авторизации
    hManForm=FindWindow("TManForm",0);
    // Расположенная на нем группа элементов управления
    hGroupBox=FindWindowEx(hManForm,0,"TGroupBox",0);

    // Список с UIN'ами
    hComboBox=FindWindowEx(hGroupBox,0,"TComboBox",0);
    // Получим длину текста в списке
    iUIN=SendMessage(hComboBox, WM_GETTEXTLENGTH, 0, 0)+1;
    // Выделяем необходимую память для буфера
    pUIN=(char*)LocalAlloc(0, iUIN);
    // Получим непосредственно текст
    SendMessage(hComboBox, WM_GETTEXT, iUIN, (long)pUIN);

    // Поле с паролем
    hEdit=FindWindowEx(hGroupBox,0,"TEdit",0);
    // Дальше все по аналогии с UIN'ом
    iPass=SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0)+1;
    pPass=(char*)LocalAlloc(0, iPass);
    SendMessage(hEdit, WM_GETTEXT, iPass, (long)pPass);

    //Выведем что получилось
    cout << "[!!!]Found for: "<< pUIN << "\tPassword: " << pPass;

    // Освободим память
    LocalFree(pUIN);
    LocalFree(pPass);
    }
     
  19. faiber

    faiber New Member

    Joined:
    6 Feb 2008
    Messages:
    4
    Likes Received:
    1
    Reputations:
    0
    Подскажи как вооше от компелировать в lcc-win32
    когда я пытаюсь откомпилировать исходный код sdbot'a выдаёт ошибку
     
  20. ForNeVeR

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

    Joined:
    1 May 2006
    Messages:
    67
    Likes Received:
    31
    Reputations:
    0
    _Sanich
    Чтобы скомпилировать в VS 2008 Express Edition сделал следующее: File > New > Project... > Win32 console application. Затем файл <Имя_проекта.cpp> привёл к такому виду:
    Code:
    #include "stdafx.h"
    
    // Подключим модули, нужные для работы программы
    #include <windows.h>
    #include <iostream>
    
    // Для удобства работы с cout
    using namespace std;
    
    void main()
    {
    // Объявим переменные, необходимые для работы
    HWND hManForm,hGroupBox,hEdit,hComboBox; // Идентификаторы форм
    char* pUIN; // Указатель на буфер для UIN
    char* pPass; // Указатель на буфер для пароля
    int iUIN; // Длина UIN
    int iPass; // Длина пароля
    
    // Найдем окно диалога авторизации
    hManForm=FindWindow(L"TManForm",0);
    // Расположенная на нем группа элементов управления
    hGroupBox=FindWindowEx(hManForm,0,L"TGroupBox",0);
    
    // Список с UIN'ами
    hComboBox=FindWindowEx(hGroupBox,0,L"TComboBox",0);
    // Получим длину текста в списке
    iUIN=SendMessage(hComboBox, WM_GETTEXTLENGTH, 0, 0)+1;
    // Выделяем необходимую память для буфера
    pUIN=(char*)LocalAlloc(0, iUIN);
    // Получим непосредственно текст
    SendMessage(hComboBox, WM_GETTEXT, iUIN, (long)pUIN);
    
    // Поле с паролем
    hEdit=FindWindowEx(hGroupBox,0,L"TEdit",0);
    // Дальше все по аналогии с UIN'ом
    iPass=SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0)+1;
    pPass=(char*)LocalAlloc(0, iPass);
    SendMessage(hEdit, WM_GETTEXT, iPass, (long)pPass);
    
    //Выведем что получилось
    cout << "[!!!]Found for: "<< pUIN << "\tPassword: " << pPass;
    
    // Освободим память
    LocalFree(pUIN);
    LocalFree(pPass);
    }
    Обрати внимание на буквы "L" перед строковыми константами (переводит строку в Unicode) - без этого (по крайней мере, в 2008 студии) работать не стало.

    После указанных действий нажал F7 и всё скомпилировалось. Извини, если рассказал излишне подробно, но просто мне неясно, на каком этапе возникли затруднения, поэтому постарался описать так, чтобы стало понятно даже чайнику ;)
     
Thread Status:
Not open for further replies.