Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП и С++ 
:(
    Опции темы
String
Дата 11.7.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 31.1.2008

Репутация: нет
Всего: нет



Добрый день.
У меня такая проблема, - использую только функциональное программирование. Никак не получается начать применять ООП. Язык вроде знаю, кое-что читал, а на практике ерунда выходит. Можешь посоветуете что-то почитать в моем случае?
В частности такие вопросы еще есть:
-Можно-ли использовать код класса не создавая объект? (В AS 2.0 так можно было вроде.)
-Можно вызывать метод класса из метода этого-же класса? А из другого?
-В методе можно сделать функцию?
-Что бы объект использовать в любой точке кода, достаточно сделать его динамическим? 
-Менять свойства объекта надо через геттеры\сеттеры как в джаве, или можно напрямую?
-Чем отличается "->" от "."?

Извините за тупые вопросы. Заранее благодарен. 
PM MAIL   Вверх
azesmcar
Дата 11.7.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



По ООП читать
Гради Буч - Объектно-ориентированный анализ и проектирование
Приемы объектно-ориентированного проектирования. Паттерны проектирования

Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
-Можно-ли использовать код класса не создавая объект? (В AS 2.0 так можно было вроде.)

если метод статический - можно.

Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
-Можно вызывать метод класса из метода этого-же класса?

конечно.

Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
А из другого?

Если есть объект.

Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
-В методе можно сделать функцию?

Метод - это обыкновенная функция. С текущим стандартом в функции нельзя написать функцию, но это ограничение можно обойти.
Код

void func()
{
   struct {
       int operator ()(int x) { return x *2; }
   } another_func;
   another_func();
}


Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
-Что бы объект использовать в любой точке кода, достаточно сделать его динамическим? 

Нет, он должен быть доступен в любой точке кода. Посмотри на шаблон синглтон, но не сильно увлекайся, это не очень хороший шаблон, хотя иногда бывает необходим.

Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
-Менять свойства объекта надо через геттеры\сеттеры как в джаве, или можно напрямую?

Можно и напрямую, все зависит от тебя. Я предпочитаю не менять переменные напрямую вообще, это сильно усложняет процесс отладки. Переменные должны быть ТОЛЬКО в private секции, модификация только через функции.

Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
-Чем отличается "->" от "."?

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

Это сообщение отредактировал(а) azesmcar - 11.7.2011, 16:01
PM   Вверх
bsa
Дата 11.7.2011, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
У меня такая проблема, - использую только функциональное программирование. Никак не получается начать применять ООП. Язык вроде знаю, кое-что читал, а на практике ерунда выходит.

Цитата(String @  11.7.2011,  15:03 Найти цитируемый пост)
-Чем отличается "->" от "."?

Эти две цитаты друг другу противоречат. Так как вторая подразумевает, что с языком С и С++ имеется только ОЧЕНЬ поверхностное знакомство.

Есть прикрепленная тема "Ответы на часто задаваемые вопросы". Рекомендую с ней ознакомиться. Особое внимание обратить на "с чего начать".
PM   Вверх
borisbn
Дата 11.7.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



String, у тебя, почему-то, сливаются воедино понятия ООП и Си++. Это независимые понятия. ООП можно пользоваться и в Си, и в Си++, и в Дельфи, и в Джаве, etc... И наоборот, можно писАть на Си++ используя классы, но при этом никакого ООП не будет и в помине (так называемый Си с классами).
В общем, у меня к тебе предложение - определись, что ты хочешь изучить ООП, Си++ или ООП в приложении к Си++. Если последнее, то IMHO не стоит начинать с Си++. Он довольно сложный язык (недавние квесты это показали smile). Начни с C#, Java и им подобных.
Повторю, это - IMHO.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ValeryLaptev
Дата 12.7.2011, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Препод



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 19.8.2010
Где: Астрахань

Репутация: 1
Всего: 1



String, самое простое - написать новый тип данных. Например, напиши класс для работы с датами. И используй потом даты в прогах. 
PM MAIL   Вверх
sidiakin
Дата 13.1.2013, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Человек задал хороший вопрос, а ответ получил - "пиши, как нравится". Это не правильно! С++ это ООП язык. Так получилось, что С++ поддерживает код написаный на С вот никто и не стал заморачиваться. Получилось что С++ это язык С где можно создать класс. Лично я долго игрался с Java и мне понравилось ООП, но в С++ я не могу даже начать писать в стиле ООП, потому что во всех туторах, учебниках и т.д. не даются примеры в стиле ООП. Есть только раздел, где рассказывается, как создать класс. Я даже пробовал найти пример простого окна на WinApi в стиле ООП. Не нашел! Единственное, где я нашел использование ООП это библиотека QT. 
PM MAIL   Вверх
bsa
Дата 13.1.2013, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



sidiakin, ООП не зависит от языка. Объектным программированием можно и на С пользоваться (например, ядро Linux). Главное, как ты мыслишь. Если ты мыслишь объектами, то ты можешь использовать практически любой язык (хоть ассемблер).
PM   Вверх
sidiakin
Дата 13.1.2013, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Не зависит. Но надо учитывать особенности языка/компилятора. Вот пытаюсь обернуть графический движок HGE в класс и не понимаю, что я делаю не так? 

Код

#include <hge.h>

class Game{
public:
    Game();
    ~Game();
public:
    HGE *hge;

    void Init();
    bool Loop();
    void Cleanup();

};

Game::Game(){
    HGE *hge=0;
}

Game::~Game(){}

void Game::Init(){
    hge=hgeCreate(HGE_VERSION);
    hge->System_SetState(HGE_FRAMEFUNC, &Loop());
    hge->System_SetState(HGE_WINDOWED, true);
    hge->System_SetState(HGE_USESOUND, false);
    hge->System_SetState(HGE_TITLE,
                    "HGE Tutorial 01 - Minimal HGE application");

    if(hge->System_Initiate())
    {
        hge->System_Start();
    }
    else
    {
        MessageBox(NULL, hge->System_GetErrorMessage(), "Error",
                    MB_OK | MB_ICONERROR | MB_APPLMODAL);
    }

}

bool Game::Loop(){
    if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;
    return false;
}

void Game::Cleanup(){
    hge->System_Shutdown();
    hge->Release();
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){

    Game game();
    game.Init();
    game.Loop();
    game.Cleanup();

    return 0;
}

PM MAIL   Вверх
bsa
Дата 13.1.2013, 13:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



sidiakin, твоя проблема в том, что ты делаешь какие-то лишние методы. При этом созданный объект класса Game не может эксплуатироваться сразу. Нужно сначала выполнить Init. Зачем? Может сразу засунуть код Init() в конструктор? Далее, указатель hge у тебя публичный. А должен быть приватным. Почитай про инкапсуляцию. А заодно про полиморфизм и наследование.
PM   Вверх
sidiakin
Дата 13.1.2013, 13:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Можно убрать Init, можно сделать указатель приватным. Только все равно работать не будет . Компилятор пишет: no matching function fo call to HGE::System_SetState(hgeFuncState, bool) ?
PM MAIL   Вверх
bsa
Дата 13.1.2013, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



sidiakin, а причем тут ООП? Ты не путай, синтаксические ошибки и способы программирования.
PM   Вверх
sidiakin
Дата 13.1.2013, 13:56 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Где синтаксические ? Вы можете прямо сказать что не так? Проблема в hge->System_SetState(HGE_FRAMEFUNC, Loop()); Метод loop возвр. true\false. Но так не работает, а если я подставлю вместо Loop() слово true\false То все работает . Я не понимаю почему так?
PM MAIL   Вверх
bsa
Дата 13.1.2013, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



сравни
Код
hge->System_SetState(HGE_FRAMEFUNC, &Loop());
с
Код
hge->System_SetState(HGE_FRAMEFUNC, Loop());

PM   Вверх
sidiakin
Дата 13.1.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 16.10.2005

Репутация: нет
Всего: нет



Ха Это был мой 2-ой вопрос  smile  Все равно и так и так не работает! Пишет no matching function fo call to HGE::System_SetState(hgeFuncState, bool) ? 
PM MAIL   Вверх
mes
Дата 13.1.2013, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата

void System_SetState(
  hgeFuncState state,
  hgeCallback value
);


Цитата(sidiakin @  13.1.2013,  12:56 Найти цитируемый пост)
, а если я подставлю вместо Loop() слово true\false То все работает

не верю, true/false c HGE_FRAMEFUNC выдаст ту же самую ошибку..

Добавлено через 1 минуту и 25 секунд
требуется указатель  на функцию типа hgeCallback..



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0954 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.