Модераторы: 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   Вверх
sidiakin
Дата 13.1.2013, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

void System_SetState(
  hgeBoolState state,
  bool value
);



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


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


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

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



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

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





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


Шустрый
*


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

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



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


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


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

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



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

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


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


Эксперт
****


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

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



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

может ты только пробовал false? Если так, то объяснение лежит на поверхности.
PM   Вверх
sidiakin
Дата 13.1.2013, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так все работает

Код

#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 То компилятор ругается 
PM MAIL   Вверх
mes
Дата 13.1.2013, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



sidiakin, никаких чудес  smile 

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


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


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

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

Это сообщение отредактировал(а) mes - 13.1.2013, 14:32


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


Шустрый
*


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

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



Я не понял, что с true не так  smile 
PM MAIL   Вверх
mes
Дата 13.1.2013, 14:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

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


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


Шустрый
*


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

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



Цитата

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


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

Цитата

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


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

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

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


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


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

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



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

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

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

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




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


Шустрый
*


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

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



Цитата

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


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

Кстати я не понял почему у меня работает &Game::Loop , а &Game::Loop()   - не работает
PM MAIL   Вверх
mes
Дата 13.1.2013, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

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



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


Шустрый
*


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

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



Хочу бросить камень в того, кто сказал "С Java на C++ можно легко перейти". Всем спасибо Бум дальше разбираться 
PM MAIL   Вверх
mes
Дата 13.1.2013, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

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



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

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

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

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

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


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

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


 




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


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

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