什么你**利用C++ABC的构造?
-
19-08-2019 - |
题
什么人在这里使用C++抽象的基类的构造为在现场吗?我谈论的纯粹的接口类没有数据成员和没有非纯粹的虚拟的成员。
任何人都可以证明的任何语使用ABC造一个有用的办法?还是只是固有的性质,使用自动边防系统实现接口,他们仍是空的,内并受到保护?
解决方案
任何人都可以证明的任何语使用ABC造一个有用的办法?
这里有一个例子,虽然这是一个人为的,罕见的例子。
你可能会用它来保持一个列表中的所有实例:
class IFoo
{
private:
//static members to keep a list of all constructed instances
typedef std::set<IFoo*> Set;
static Set s_set;
protected:
//new instance being created
IFoo()
{
s_set.insert(this);
}
public:
//instance being destroyed
virtual ~IFoo()
{
s_set.remove(this);
}
... plus some other static method and/or property
which accesses the set of all instances ...
};
还是只是固有的性质,使用自动边防系统实现接口,他们仍是空的,内并受到保护?
更通常他们只是不声明的。没有理由宣布他们:
- 空和内联=>为什么还要声明?
- 保护=>ABC可能已经有一些 纯粹的虚拟 方法,并因此已经不可能实例,除了作为一个亚类。
其他提示
假设有一些行为,是共同所有衍生课程。例如登记本身在一些外部注册或检查有效性的东西。
所有这一共同的代码可以被安置在基类的构造,以及它会被称为隐含从建设的各个源类别。
如何 可能 一个抽象的基类的构造以用于什么?
假设你有一个抽象的基B类和源类D.当一个对象D类型的创建、B的构造是所谓第一,但在这一点上,对象"是"还是B型(见 在这里,)--尤其是,调用任何虚拟的职能从身体的构造将呼叫 B自己的实现 这些职能。但如果B是一个纯粹的抽象类,没有这些虚拟的功能定义,这样的程序会立即崩溃。
我猜你打算用于B的构造叫下来的大多数来源级的(例如D)实施一个虚拟的功能,对吗?这将是一个糟糕的想法一般是因为德的对象是没有完全构成的,所以任何访问成员变量在D从内部D的执行情况的虚拟功能将访问未初始化记忆。
请记住: "资源获取被初始化".
有时候,我们使用抽象的基类作为某种形式的锁定机构。例如,在一个多线程的环境,那里几个线程需要共享一个单一的资源,那么一个线程可以使用的构造作为一种方式获得资源,析构释放资源
void PlayWithPaintBallGun(Target &target)
{
PaintBallGun paintBallGun; // constructor waits until the gun is free,
// then picks it up.
paintBallGun.Aim(target); // Shoot something
paintBallGun.Fire(); //
// Clever! The destructor is automatically
// called when it goes out of scope. So we
// can't forget to put the gun down.
}
Hugo
我不能想想许多有用的例子。一类无数据-的成员已经没有一个国家因而不能初始化的任何东西。你可以拥有的构造/析构做记录你,虽然。例如,日志建立/销毁的所有访问对象:
class Visitor {
public:
Visitor() {
std::cout << "Visitor@" << this << " created"
<< std::endl;
}
virtual ~Visitor() {
std::cout << "Visitor@" << this << " destroyed"
<< std::endl;
}
virtual void visitA(A*) = 0;
virtual void visitB(B*) = 0;
// ...
};
通常它只是为初始化各成员以合理的价值观。