Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2013, 23:40   #1
Jawner
Пользователь
 
Регистрация: 11.04.2012
Сообщений: 15
По умолчанию Обьектно-ориентированное программирование. Нужно разобраться в деталях.

Доброго времени суток. Изучаем ООП, нужна помощь в объяснении некоторых нюансов.
Вот собственно программа, которая оценивает жениха(лол).

#pragma hdrstop - для чего нужна эта деректива ?

Модуль 1.cpp

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float vik,ball,P;
vik=StrToFloat(Edit1->Text);
ball=StrToFloat(Edit2->Text);
P=StrToFloat(Edit3->Text);
Tzenih A(vik,ball);
Tzenih2 B(vik,ball,P);
Edit4->Text=FloatToStr(A.qq());
Edit5->Text=FloatToStr(B.pp());
}

Здесь вроде все понятно: 2 конструктора и вызов двух функций из класса Tzenih и его наследника.

Модуль 2
Заголовок
Код:
class Tzenih {
public:
float vik,ball,Q;
Tzenih(float ivik,float iball);
float qq();
};
Пока не пойму одного - зачем нужны спецификаторы доступа public,private,protected?
В private - объявление скрытых элементов. От кого они скрываются ?
В protected объявляются элементы доступные только потомкам. Разве нельзя объявить это же в public(что собственно я и сделал).
Конструкторы обязательно должны называться так же как и класс ?

Модуль 2 cpp

Код:
Tzenih::Tzenih(float ivik,float iball)
{
vik=ivik;
ball=iball;
}

float Tzenih::qq(void)
{Q=ball-pow((vik-20),2);
return Q;}
Для чего нужно двойное двоеточие(: и одинарное ?

Модуль 3. заголовок

Код:
class Tzenih2:public Tzenih {
public:
         float P,Qp;
       Tzenih2(float ivik,float iball,float iP);
       float pp(void);
};
Tzenih2ublic Tzenih - это я унаследовал public секцию от класса Tzenih?

Vjlekm 3. cpp

Код:
Tzenih2::Tzenih2(float ivik,float iball,float iP):Tzenih(ivik,iball)
{
P=iP;
}

float Tzenih2::pp(void)
{
Qp=pow(P,3)+Tzenih::qq();
return Qp;
};

За раннее спасибо за ответы!
Jawner вне форума Ответить с цитированием
Старый 28.05.2013, 10:04   #2
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

1) Смысл private - скрыть "ненужные" для потомков данные и функции, если их вызов или использование нежелательны. В домашней микроволновке тебе же хватает панели управления (public-интерфейс) и ты не лезешь замыкать контакты в блок питания (private-секция)
2) В protected помещаются данные и функции, которые нужны для внутренних вызовов класса и потомков.
3) Конструкторы обязательно называются так же, как класс.
4) Двойное двоеточие - описание функции-члена класса, одинарное - наследование класса от базового.
5) Унаследовал
FataLL вне форума Ответить с цитированием
Старый 28.05.2013, 11:53   #3
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

ООП зиждется на инкапсуляции (сокрытии ненужной пользователю информации), полиморфизме (поведении разных объектов как одного и того же) и виртуальных функциях (поведение класса зависит от того какой он).
public, private, protected нужны для первого и частично для третьего. Public – определяет, что все свойства и методы класса будут доступны для использующего класс. Private – определяет свойства и методы доступные ТОЛЬКО этому классу. FataLL вам верно сказал его смысл. Protected – имеет смысл ТОЛЬКО там, где будет наследование. Оно нужно для того, чтобы наследник имел доступ к каким-то свойствам или функциям базового класса. Т.е. private ограничивает доступ ТОЛЬКО членами класса, а protected расширяет его на непосредственных наследников этого класса.
Далее, двойное двоеточие может расширять область видимости. Совсем не то, что говорил FataLL. Пример: ::GetTickCount() – говорит о том, что функция взята из глобального пространства имён. std::string говорит о том, что объявление string находится в пространстве имён std. Также и для методов класса – нужно компилятору указать, где их искать. Одинарное двоеточие чаще используется, чтобы указать компилятору, какой метод класса реализуется. Подробностей уже не помню.
Все вопросы, которые я оставил без ответа вам уже осветил FataLL.
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то

Последний раз редактировалось Airhand; 28.05.2013 в 11:55.
Airhand вне форума Ответить с цитированием
Старый 30.05.2013, 00:39   #4
Jawner
Пользователь
 
Регистрация: 11.04.2012
Сообщений: 15
По умолчанию

Очень большое спасибо за ответы товарищи, большое спасибо!
Вот еще одна программа.
В общем нужно унаследоваться от TStringGrid, у обьектов которого при нажатии F11 исчезают фиксированные строки и колонки, а при повторном нажатии снова появляются.

В коментариях постараюсь разместить интересующие моменты

заголовок библиотеки StringGri

Код:
class PACKAGE TStringGri : public TStringGrid //что такое PACKAGE? и здесь я наследую от TStringGrid секцию public?
{
private:    bool f;
protected:
public:
        __fastcall TStringGri(TComponent* Owner); //что это такое?
        DYNAMIC void __fastcall KeyUp(Word &Key,Classes::TShiftState Shift);// это динамическая функция из класса TStringGrid
__published: //это я не знаю что такое
};
SringGri.cpp

Код:
static inline void ValidCtrCheck(TStringGri *) // что это за функция ?
{
        new TStringGri(NULL);
}
//---------------------------------------------------------------------------
__fastcall TStringGri::TStringGri(TComponent* Owner) // что это за функция?
        : TStringGrid(Owner)
{
}

void __fastcall TStringGri :: KeyUp(Word &Key,Classes::TShiftState Shift) // использую функцию из унаследованного класса TStringGrid
{ 
if(Key==VK_F11)
{
if(!f)
{FixedCols=0;
 FixedRows=0;
 f=!f;
 }
else
{FixedCols=1;
 FixedRows=1;
 f=!f;
 }
}
}
Unint.cpp

Код:
TForm1 *Form1; //создаю экземпляр класса TForm ?
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
TStringGri *A=new TStringGri(Form1);
A->Parent=Form1;
A->ColCount=4;
A->RowCount=5;
A->Top=100;
A->Left=60;
}
Что такое __fastcall ?

Еще раз заранее спасибо за ответы.
Jawner вне форума Ответить с цитированием
Старый 30.05.2013, 06:27   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Jawner Посмотреть сообщение
Что такое __fastcall ?
Указание компилятору на то, что в данной подпрограмме необходимо использовать внутренние регистры процессора. Данная команда не всегда выполнима, но если её нет, то вычисления происходят предпочтительно в оперативной памяти, что замедляет исполнение программы.
Само название fast call, говорит само за себя. Это быстрый вызов.
Чаще всего, компилятор отдаёт предпочтение для размещения в регистрах, счётчики циклов for. Но если у процессора имеется кеш-память, в ней может располагаться часть стека, и вызываемые через него функции.
Кеш, это так называема сверхоперативная память, размещённая внутри самого процессора.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 30.05.2013 в 11:30.
Smitt&Wesson вне форума Ответить с цитированием
Старый 30.05.2013, 11:25   #6
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

Идём по порядку:
1. Я могу ошибаться, но вроде от визуальных компонент нельзя так просто наследоваться.
2.
Цитата:
class PACKAGE TStringGri : public TStringGrid //что такое PACKAGE? и здесь я наследую от TStringGrid секцию public?
– надо понимать, что унаследованный класс – это тот же класс, только с добавленными свойствами и методами. «public» только указывает на область видимости всего, что описано в классе, но сам класс не изменится. Учитывая первое, ни от кого вам наследоваться не удастся.
3.
Цитата:
TForm1 *Form1; //создаю экземпляр класса TForm ?
Экземпляр НЕ создаётся. Создаётся ТОЛЬКО указатель на класс (который занимает 4 байта и там неизвестно что).
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно переделать в объектно-ориентированное программирование Андрей11111 Паскаль, Turbo Pascal, PascalABC.NET 9 29.05.2012 16:14
Объектно-ориентированное программирование Kira444 Помощь студентам 21 03.02.2011 16:34
Обьектно-ориентированное программирование.Делфи Den55 Помощь студентам 0 30.05.2010 23:22
Объектно -ориентированное программирование Asira Помощь студентам 3 05.03.2010 17:52