LINUX.ORG.RU

Прошу пример красивой ООП программы c++, java

 , ,


0

5

Имеется ввиду пример маленькой программы с использованием паттернов, наследований и т.п. что бы все выглядело понятно и красиво. Есть ли такой? А то ООП головного мозга

Перемещено mono из talks

маленькой программы с использованием паттернов

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

Manhunt ★★★★★ ()

маленькой

ООП

Не имеет смысла. Если только учебное что-нибудь, но тогда непонятна сама суть такого извращения. Это что-то из рода больных на голову работодателей, заставляющих жуниоров писать ООП-код для чисто процедурной задачи.

Solace ★★ ()

красивой ООП программы c++, java
красивой
ООП
c++
java

Ну толсто же.

anonymous ()
Ответ на: комментарий от anonymous

Ну толсто же.

Теперь это тред борщелиспа? :D

Manhunt ★★★★★ ()

Не благодари

#include <iostream>


class Animal
{
public:
    Animal(){}

    virtual void say() = 0;
};


class Cat : public Animal
{
public:

    Cat(){}

    void say()
    {
        std::cout << "meow!" << std::endl;
    }
};


class Dog : public Animal
{
public:

    Dog(){}

    void say()
    {
        std::cout << "woof!" << std::endl;
    }
};


typedef struct
{
    Animal *animal;
    void (Animal::*func)();
}callback;


void say_something(callback c)
{
    (c.animal->*c.func)();
}


int main()
{
    Cat cat;
    Dog dog;

    callback calldog = (callback){&dog, &Animal::say};
    callback callcat = (callback){&cat, &Animal::say};

    say_something(calldog);
    say_something(callcat);

    return 0;
}
d ★★★ ()
Ответ на: Не благодари от d

Re: Не благодари

А с мащинами и деталями так же можно?

anonymous ()
Ответ на: Не благодари от d
typedef struct
{
    Animal *animal;
    void (Animal::*func)();
}callback;

Незачёт. Во-первых, за typedef вместо простого struct (наследине говносишечки), во-вторых, за велосипед вместо std::function.

callback calldog = (callback){&dog, &Animal::say};
callback callcat = (callback){&cat, &Animal::say};

Ещё незачёт за неиспользование uniform initialization:

callback calldog{&dog, &Animal::say};
callback callcat{&cat, &Animal::say};

Ну и ещё можно докопаться к игнорированию виртуальных функций (say_something должна получать Animal*), константности функции say и отсутствию override при переопределении say.

Begemoth ★★★★★ ()
Последнее исправление: Begemoth (всего исправлений: 3)

В C++ пошли по еретическому пути generic programming, и теперь красивого ООП там не найдешь.

В Java хорошего, качественного ООП полно - смотри на тот же Spring, например.

anonymous ()
Ответ на: Re: Не благодари от anonymous

А с мащинами и деталями так же можно?

Нет, они не должны издавать звуков.

d ★★★ ()
Ответ на: комментарий от Begemoth

наследине говносишечки

Да, я на самом деле сишник. А этот пример написал как-то, чтобы убедиться, что "и так можно".

Спасибо за ликбез; думаю, и ТСу будет полезно.

d ★★★ ()
Ответ на: Не благодари от d

Да это тривиально. Нужен реально поддерживаемый проект опенсорсный.

pozitiffcat ★★ ()
Ответ на: комментарий от pozitiffcat

Имеется в виду пример маленькой программы

Нужен реально поддерживаемый проект опенсорсный

Ты уж определись. Какой вопрос — такой ответ.

d ★★★ ()

могу скинуть свой плеер времен студенчества

там java, oop, swing, mvc

вроде даже еще компилируется и запускается

unt1tled ★★★★ ()
Ответ на: Не благодари от d
class Cat {
public:
  void say() { std::cout << "meow!\n";}
};

class Dog {
public:
  void say() { std::cout << "woof!\n";}
};

class IAnimal {
public:
  virtual void say () = 0;
  virtual ~IAnimal() {}
};

template<typename I, typename T, typename F>
I* get_animal(T *src, F funcPtr) {
  class IPtr : public I {
  public:
    IPtr(T* src, F funcPtr) : m_ptr(src), m_funcPtr(funcPtr){}
    ~IPtr() { delete m_ptr; }
    void say() { return ((*m_ptr).*m_funcPtr)(); }
  private:		
    T* m_ptr;
    F m_funcPtr;
  };
  return new IPtr(src, funcPtr);
}

void test() {
  typedef std::vector<IAnimal*> Zoo;
  Zoo zoo;
  zoo.push_back(get_animal<IAnimal>(new Cat(), &Cat::say));
  zoo.push_back(get_animal<IAnimal>(new Dog(), &Dog::say));
	
  for (Zoo::iterator it=zoo.begin(); it!=zoo.end(); ++it)
    (*it)->say();
	
  for (Zoo::iterator it=zoo.begin(); it!=zoo.end(); ++it)
    delete *it;
}
marat2345 ()
Ответ на: комментарий от marat2345

А теперь то же, но для десятка методов с аргументами :)

Ну и new тут не нужен.

quasimoto ★★★★ ()
Ответ на: комментарий от vazgen05
public private class

походу жаба автору нехило доставляет

anonymous ()
Ответ на: комментарий от marat2345
~IPtr() { delete m_ptr; }

Зачем удалять объект после того как мы его уже не используем как Animal?

anonymous ()
Ответ на: комментарий от alexku

Кто-нибудь вообще может объяснить, что эти люди пытаются здесь написать?

anonymous ()

Нашел принцип - KISS - не усложняй тупица. Это сняло с меня груз =)

pozitiffcat ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.