-4

次のクラスがモノモーフィックかどうか教えてください。

それを単形にするものは何ですか?モノモーフィックとは実際にはどういう意味ですか?

class Foo
{
public:
    Foo(int n)
    {
        this->m = n;
    }

    void print()
    {
        std::cout << this->m << std::endl;
    }

private:
    int m;
};

編集:

クラス Boo のコンテキストで:

class Boo
{
 public:
  Boo& Boo::operator=(const Boo &boo)
  {
     *foo1 = *boo.foo1;
     *foo2 = *boo.foo2;

     return *this;
  }

 private:
   Foo* foo1;
   Foo* foo2;
};
4

2 に答える 2

7

まず、この質問に答えるためには、monomorphic本当の意味を調べる必要があります。そのために、単語を分解してみましょう。

モノ - モーフィック

したがって、 mono = oneおよびmorphic = transformableと仮定すると(少なくともこの例では - 辞書のセマンティクスで私を殺さないでください)。

ですから、これは多くのことを意味するものと解釈できます。

  1. 私たちのクラスは一度だけ変更できます
  2. または、ポリモーフィズムの反対として使用できます (サブクラス化できないことを意味します)。
  3. 最後に、数学の性質を参照できます: http://en.wikipedia.org/wiki/Monomorphism

したがって、答え 3 が探しているものではないと仮定して (この場合、その記事は混乱を招くため、より適切な答えを見つける必要があります)、1 と 2 に進みましょう。

1. クラスの変更は一度のみ可能です

私の意見では、これが最も可能性の高い意味です。つまり、コンストラクター (指定されたコンストラクターまたは組み込みのコピー コンストラクター) を介して一度だけ変更できます。

読み書き可能なメモリを備えたコンピュータでは、必要に応じてメモリ内のビットを手動で設定する方法がほとんど常にあるため、これは当てはまりません。

ただし、そのシナリオを除いて、提供したインターフェイスを使用すると、はい、クラスはメンバー ( ) がコンストラクターを介してのみ設定されるという点でモノモーフィックです。m

2. 私たちのクラスはポリモーフィックではありません

これに対する答えは少し複雑です。ほとんどの言語とは異なり、C++ には 2 つの形式のポリモーフィズムがあります。従来の OO の意味では、 としてマークされるサブクラスによって上書きされる関数を作成する機能がありますvirtual。ただし、これを行わないため、クラスで OO ポリモーフィズムを使用することはできません。

ただし、前述したように、C++ で使用できるポリモーフィズムには複数の種類があります。2 番目のタイプはtemplate polymorphismorと呼ばれfunction polymorphism、STL 全体で (主にイテレータ用に) 使用され、次のように動作します。

template<typename aImpl>
void printA(const aImpl &a)
{
    a.print();
}

class A {
    public:
    void print() { puts("I'm in A!"); }
};     

これは完全に有効なインターフェイスであり、期待どおりに機能します。ただし、次のクラスを関数に配置することを妨げるものは何もありません。

class B {
    public:
    void print() { puts("I'm in B!"); }
};

これは明らかに異なる値を出力します。

結局のところ、C++ は複雑な言語であり、本当にクラスをポリモーフィックにしないようにしたい場合は、すべてのメンバーと関数をプライベートにする必要があります。これは、そもそもオブジェクトを持つ目的を無効にします。

于 2012-09-24T12:04:02.033 に答える