Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > ООП и С++


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

Извините за тупые вопросы. Заранее благодарен. 

Автор: azesmcar 11.7.2011, 15:49
По ООП читать
http://www.ozon.ru/context/detail/id/87972/
http://www.ozon.ru/context/detail/id/2457392/

Цитата(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 Найти цитируемый пост)
-Чем отличается "->" от "."?

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

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

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

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

Есть прикрепленная тема "Ответы на часто задаваемые вопросы". Рекомендую с ней ознакомиться. Особое внимание обратить на "с чего начать".

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

Автор: ValeryLaptev 12.7.2011, 07:17
String, самое простое - написать новый тип данных. Например, напиши класс для работы с датами. И используй потом даты в прогах. 

Автор: sidiakin 13.1.2013, 09:29
Человек задал хороший вопрос, а ответ получил - "пиши, как нравится". Это не правильно! С++ это ООП язык. Так получилось, что С++ поддерживает код написаный на С вот никто и не стал заморачиваться. Получилось что С++ это язык С где можно создать класс. Лично я долго игрался с Java и мне понравилось ООП, но в С++ я не могу даже начать писать в стиле ООП, потому что во всех туторах, учебниках и т.д. не даются примеры в стиле ООП. Есть только раздел, где рассказывается, как создать класс. Я даже пробовал найти пример простого окна на WinApi в стиле ООП. Не нашел! Единственное, где я нашел использование ООП это библиотека QT. 

Автор: bsa 13.1.2013, 11:29
sidiakin, ООП не зависит от языка. Объектным программированием можно и на С пользоваться (например, ядро Linux). Главное, как ты мыслишь. Если ты мыслишь объектами, то ты можешь использовать практически любой язык (хоть ассемблер).

Автор: sidiakin 13.1.2013, 12:32
Не зависит. Но надо учитывать особенности языка/компилятора. Вот пытаюсь обернуть графический движок 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;
}

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

Автор: sidiakin 13.1.2013, 13:16
Можно убрать Init, можно сделать указатель приватным. Только все равно работать не будет . Компилятор пишет: no matching function fo call to HGE::System_SetState(hgeFuncState, bool) ?

Автор: bsa 13.1.2013, 13:53
sidiakin, а причем тут ООП? Ты не путай, синтаксические ошибки и способы программирования.

Автор: sidiakin 13.1.2013, 13:56
Где синтаксические ? Вы можете прямо сказать что не так? Проблема в hge->System_SetState(HGE_FRAMEFUNC, Loop()); Метод loop возвр. true\false. Но так не работает, а если я подставлю вместо Loop() слово true\false То все работает . Я не понимаю почему так?

Автор: bsa 13.1.2013, 14:01
сравни
Код
hge->System_SetState(HGE_FRAMEFUNC, &Loop());
с
Код
hge->System_SetState(HGE_FRAMEFUNC, Loop());

Автор: sidiakin 13.1.2013, 14:05
Ха Это был мой 2-ой вопрос  smile  Все равно и так и так не работает! Пишет no matching function fo call to HGE::System_SetState(hgeFuncState, bool) ? 

Автор: mes 13.1.2013, 14:10
Цитата

void System_SetState(
  hgeFuncState state,
  hgeCallback value
);


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

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

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

Автор: sidiakin 13.1.2013, 14:12
Код

void System_SetState(
  hgeBoolState state,
  bool value
);



Не выдаст

Автор: mes 13.1.2013, 14:16
Цитата(sidiakin @  13.1.2013,  13:12 Найти цитируемый пост)
Не выдаст 

Цитата(mes @  13.1.2013,  13:10 Найти цитируемый пост)
c HGE_FRAMEFUNC выдаст



Автор: sidiakin 13.1.2013, 14:19
А у меня все работает 

Автор: mes 13.1.2013, 14:24
Цитата(sidiakin @  13.1.2013,  13:19 Найти цитируемый пост)
А у меня все работает  

покажите эту строчку.. 

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

может ты только пробовал false? Если так, то объяснение лежит на поверхности.

Автор: sidiakin 13.1.2013, 14:28
Так все работает

Код

#include <hge.h>

class Game{
public:
    Game();
    ~Game();
private:
    HGE *hge;
public:
    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, false);
    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;
}


Если я в hge->System_SetState(HGE_FRAMEFUNC, false); вместо false подставлю метод Loop() или true То компилятор ругается 

Автор: mes 13.1.2013, 14:29
sidiakin, никаких чудес  smile 

Цитата(bsa @  13.1.2013,  13:27 Найти цитируемый пост)
может ты только пробовал false? Если так, то объяснение лежит на поверхности. 


Добавлено @ 14:30
sidiakin, 
Цитата(bsa @  13.1.2013,  13:27 Найти цитируемый пост)
Правильно заданный вопрос - половина ответа


старайтесь точнее формулировать и проверять, это сэкономит нe только нам, но и Вам самим и время и нервы  smile

Добавлено через 4 минуты и 55 секунд
в общем передавайте туда указатель на функцию и будет Вам счастие.. 
перед этим погуглите почему метод (нестатичная функция класса) для этой роли не годится.. 
и да не забудьте уточнить сигнатуру ожидаемой функции..

Автор: sidiakin 13.1.2013, 14:34
Я не понял, что с true не так  smile 

Автор: mes 13.1.2013, 14:36
Цитата(sidiakin @  13.1.2013,  13:34 Найти цитируемый пост)
Я не понял, что с true не так

 это с false не так.. равна нулю и как литера приводима к нулевому указателю.. 

Автор: sidiakin 13.1.2013, 15:46
Цитата

в общем передавайте туда указатель на функцию и будет Вам счастие.. 


Не понял, как это сделать

Цитата

перед этим погуглите почему метод (нестатичная функция класса) для этой роли не годится.. 


А для чего тогда этот форум?

Вобщем я зделал метод статическим и все заработало  smile 

Автор: mes 13.1.2013, 15:51
Цитата(sidiakin @  13.1.2013,  14:46 Найти цитируемый пост)
А для чего тогда этот форум?

ну  не для того, чтоб сто раз из пустого в порожнее периливать.. smile

Добавлено через 52 секунды
Цитата(sidiakin @  13.1.2013,  14:46 Найти цитируемый пост)
Вобщем я зделал метод статическим и все заработало

потому и 
Цитата(mes @  13.1.2013,  13:29 Найти цитируемый пост)
перед этим погуглите почему метод (нестатичная функция класса) для этой роли не годится.. 


Автор: sidiakin 13.1.2013, 16:03
Цитата

перед этим погуглите почему метод (нестатичная функция класса) для этой роли не годится.. 


Нуу я так понял, что нестатичная ф-ия передает еще и указатель на объект...

Кстати я не понял почему у меня работает &Game::Loop , а &Game::Loop()   - не работает

Автор: mes 13.1.2013, 16:16
Цитата(sidiakin @  13.1.2013,  15:03 Найти цитируемый пост)
Кстати я не понял почему у меня работает &Game::Loop , а &Game::Loop()   - не работает 

потому что в первом случае берете адрес функции, а во втором адрес результата функции.. 

Автор: sidiakin 13.1.2013, 16:20
Хочу бросить камень в того, кто сказал "С Java на C++ можно легко перейти". Всем спасибо Бум дальше разбираться 

Автор: mes 13.1.2013, 16:36
Цитата(sidiakin @  13.1.2013,  15:20 Найти цитируемый пост)
Хочу бросить камень в того, кто сказал "С Java на C++ можно легко перейти"

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)