什么是c ++单态类,这是一个例子



请告诉我,下面的类是单态的吗?

是什么使它成为单态的?单态到底是什么意思?

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;
};

首先,为了回答这个问题,我们需要检查monomorphic的真正含义。为此,让我们分解一下这个词:

单声道 - 形态

所以,如果我们假设单声道 = 一morphic = 可变换(至少对于这个例子 - 不要因为字典语义而杀死我)

所以,我们可以把这理解为很多事情,这里有一些我的想法:

  1. 我们的班级只能改一次
  2. 或者它可以用作多态性的对立面(意味着它不能被子类化)
  3. 最后,它可以指数学的性质:http://en.wikipedia.org/wiki/Monomorphism

因此,假设答案 3 不是我们要找的(在这种情况下,您必须找到更好的答案,因为该文章令人困惑),让我们逐步完成 1 和 2。

1. 我们的班级只能换一次

在我看来,这是最有可能的意思。乍一看,您的对象是单态的,这意味着它只能通过构造函数(无论是指定的构造函数还是内置的复制构造函数)更改一次。

在任何具有读写内存的计算机中,这都不可能是真的,因为如果您愿意/需要,几乎总有一种方法可以手动设置内存中的位。

但是,除非这种情况,使用您提供的接口,那么是的,您的类是单态的,因为它的成员(m)仅通过构造函数设置。

2. 我们的类不是多态的

这个问题的答案有点复杂。与大多数语言不同,C++有两种形式的多态性。在传统的OO意义上,它能够创建被子类覆盖的函数,该子类将被标记为virtual。但是,您不这样做,因此您的类无法实现 OO 多态性。

但是,正如我之前所说,C++中可用的多态性不止一种。第二种类型被称为template polymorphismfunction 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++是一种复杂的语言,如果你真的希望一个类不能是多态的,你需要让所有成员和函数都是私有的,这首先违背了拥有对象的目的。

我遇到了这篇文章,其中术语"单态"用于C++语言的上下文中,即1997年的赋值运算符剖析。这个词似乎很少在其他地方使用,这意味着它可能在 90 年代在C++圈子里漂浮,但没有获得太大的牵引力,不再使用。文章指出:

问题如下:

请考虑以下类定义:

class TFoo : public TSuperFoo {
TBar* fBar1;
TBar* fBar2;
// various method definitions go here...
}

您有一个类TFoo,它来自一个类,TSuperFoo和 它有两个数据成员,这两个成员都是指向 类TBar.出于本练习的目的,请考虑这两个指针 拥有语义,TBar成为单态类。写 此类的赋值运算符。

查看各种字典定义,词根"morphic"最常被定义为"具有特定的形式或形状",然后有一些迹象表明它通常与某些前缀一起使用,例如poly(polymorphic)或homo(homomorphic)。

前缀"单"通常被定义为"单"或"一"或">

孤",通常与一些后缀一起使用,例如"飞机"(单翼飞机或单翼飞机)或"轨道"(单轨或单轨或轨道)。

在这种情况下以及似乎是问题,"单态"(单一形成)被用作"多态"(许多形成)的对立面。单态类是不用作任何其他类的基类,也不派生自另一个类的类。

单态类的更严格定义是该类还必须仅使用单态类或内置数据类型。单态类不得包含任何多态类作为其定义或行为的一部分。

这确实提出了一个问题,即严格的单态类是否可以包含模板化变量或方法。我的第一个直觉是,只要模板创建一个单态类,那就没问题了。换句话说,如果编译器正在为您编写一个单态类,则与行下方隔间的 Sally 编写它是一样的。

因此,也许严格的定义应该排除运行时多态性?

因此,根据单态类的第一个不太严格的定义,问题中的类Foo似乎是单态的,因为它不是从任何其他类派生的,也没有virtual析构函数,暗示它不打算用于派生另一个类,也没有任何virtual方法。

但是,它确实在print()方法中使用了std::cout,并且std::cout绝对是多态的。因此,也许声称这是一个半单态类会更准确,因为它使用的是多态类?

看起来,单态类是独立的。但是,我们如何编写一个类,使其独立存在,编译器将标记任何从该类派生另一个类的尝试。

C++允许一个类通过从现有类派生一个新类来成为其他类的超类。关于什么是可能的,多态性如何成功工作,有时有许多非常复杂的规则,但是最终将final关键字(C++11)与类一起使用是创建无法派生另一个类的类的唯一合理方法。

虽然浏览了一下,但我发现这篇文章,在C++中模拟最终类,它提供了一种使用private构造函数和virtual继承的方法。

/* A program without any compilation error to demonstrate that instances of 
the Final class can be created */
#include<iostream>
using namespace std;
class Final;
class MakeFinal
{
private:
MakeFinal() { cout << "MakeFinal constructor" << endl; }
friend class Final;
};
class Final : virtual MakeFinal
{
public:
Final() { cout << "Final constructor" << endl; }
};
int main(int argc, char *argv[])
{
Final f;
return 0;
}

最新更新