4

良い一日、

次のコードを考慮すると、典型的なOOPをパラダイムとして分類できますか?

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

2 に答える 2

3

いいえ、そうは思いません。「プロトタイプ」OOと「クラシック」OOの主な違いは、プロトタイプOOにはクラスがないことです。つまり、プロトタイプ自体がオブジェクトです。プロトタイプが変更された場合、プロトタイプから「継承」するすべてのオブジェクトがそれに続きます。この例では、そうではありません。

于 2013-03-01T23:13:28.017 に答える
2

多くの混乱に気づかずにはいられません。

  1. メンバー関数テンプレート「作成」は実際にはありません

    • TestClassインスタンスと関係があります(静的である必要があります)
    • 含まれているTestClassのテンプレート引数と関係があります(クラステンプレートのメンバーではなく、名前空間関数である必要があります)
  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;
}

そして、いいえ、私はこのコードがあまり「慣用的」であるとは思いません。私はそれを見たことがありません(タプルのようなクラスの単純な実装に似ているかもしれませんが、とにかく慣用的ではありません:慣用的なのはそのようなクラスを書くのではなく、std :: tupleを構成することです(ブーストにはいくつかのフレーバーがあります拡張機能)

于 2013-03-01T23:33:48.247 に答える