Добрый день,
учитывая следующий код, можно ли классифицировать прототип ООП как парадигму в
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;
}
К вашему сведению, я забыл управлять своей памятью, извините!
Нет, я так не думаю. Ключевое различие между «прототипным» и «классическим» ОО состоит в том, что у прототипного ОО нет классов: сам прототип является объектом. Если прототип модифицирован, все объекты, «наследуемые» от него, следуют его примеру. В этом примере это не так.
Я не могу не заметить большую путаницу.
Шаблон функции-члена «Создать» на самом деле не
неуниверсальный Create
метод должен использовать имя типа «вставлено» вместо того, чтобы излагать аргументы шаблона без необходимости
здесь нет полиморфного использования, поэтому не нужно лишних динамических выделений или необработанных указателей (это также решает проблему с очисткой памяти)
мелкая гнида: попробуйте использовать менее запутанные имена и форматирование в примерах
Вот мой эквивалент:
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 имеет несколько разновидностей с расширениями)