c ++ 11 — Можно ли считать прототип ООП парадигмой в C ++?

Добрый день,

учитывая следующий код, можно ли классифицировать прототип ООП как парадигму в

C ++?

#include <iostream>

template< class... Bases >
struct TestClass : public Bases...
{
int a;
template< class... Parents >
TestClass< Parents... >* Create() {
return new TestClass< Parents... >();
}
TestClass< Bases... >* Create() {
return new TestClass< Bases... >();
}
};
struct Foo {
int fizz;
};
struct Bar {
int buzz;
};
int main()
{
TestClass< Foo > a;
a.a = 10;
a.fizz = 20;
std::cerr << a.fizz << "\n";
std::cerr << a.a << "\n";
auto b = a.Create();
b->fizz = 30;
std::cerr << b->fizz << "\n";
auto c = b->Create< Bar >();
c->buzz = 357;
std::cerr << c->buzz << "\n";
auto d = b->Create< Foo, Bar >();
d->fizz = 0;
d->buzz = 1;
std::cerr << d->fizz << "\n";
std::cerr << d->buzz << "\n";
return 0;
}

К вашему сведению, я забыл управлять своей памятью, извините!

4

Решение

Нет, я так не думаю. Ключевое различие между «прототипным» и «классическим» ОО состоит в том, что у прототипного ОО нет классов: сам прототип является объектом. Если прототип модифицирован, все объекты, «наследуемые» от него, следуют его примеру. В этом примере это не так.

3

Другие решения

Я не могу не заметить большую путаницу.

  1. Шаблон функции-члена «Создать» на самом деле не

    • иметь что-нибудь с экземпляром TestClass (должно быть статическим)
    • есть что-нибудь с содержащими TestClass’s аргументы шаблона (должна быть функцией пространства имен, а не членом шаблона класса)
  2. неуниверсальный Create метод должен использовать имя типа «вставлено» вместо того, чтобы излагать аргументы шаблона без необходимости

  3. здесь нет полиморфного использования, поэтому не нужно лишних динамических выделений или необработанных указателей (это также решает проблему с очисткой памяти)

  4. мелкая гнида: попробуйте использовать менее запутанные имена и форматирование в примерах

Вот мой эквивалент:

template< class... Bases >
struct TestClass : public Bases... {
int testfield;
TestClass Create() {
return TestClass();
}
};

template< class... Parents >
static TestClass< Parents... > CreateTestClass() {
return TestClass<Parents... >();
}

struct Fizzer {
int fizz;
};
struct Buzzer {
int buzz;
};
int main()
{
TestClass< Fizzer > fizzer;
fizzer.testfield = 10;
fizzer.fizz = 20;

auto b = fizzer.Create();
b.fizz = 30;

auto c = CreateTestClass< Buzzer >();
c.buzz = 357;

auto d = CreateTestClass< Fizzer, Buzzer >();
d.fizz = 0;
d.buzz = 1;
}

И, нет, я не думаю, что этот код «идиоматичен» для многих. Я не видел этого (хотя это может напоминать прямую реализацию класса, подобного кортежу). Это не идиоматично, так или иначе: idiomatic будет не написать такой класс, но составить std :: tuple (boost имеет несколько разновидностей с расширениями)

2

По вопросам рекламы [email protected]