*你*使用C ++ ABC构造函数做什么?

时间:2009-01-17 14:57:49

标签: c++ constructor interface-design abc

这里的人们在现场使用C ++抽象基类构造函数是什么?我说的是没有数据成员且没有非纯虚拟成员的纯接口类。

任何人都可以用有用的方式展示任何使用ABC构造函数的习语吗?或者它只是固有的使用ABCs来实现接口,它们保持空,内联和受保护?

6 个答案:

答案 0 :(得分:5)

  

任何人都可以用有用的方式展示任何使用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 ...
};
  

或者它只是固有的使用ABCs来实现它们保持空,内联和受保护的接口的本质?

通常情况下,他们根本就没有宣布!没有理由声明它们:

  • 空和内联=&gt;为什么还要申报呢?
  • 受保护=&gt; ABC可能已经有一些纯虚方法,因此除了作为子类之外,已经无法实例化。

答案 1 :(得分:3)

假设存在一些对所有派生类都很常见的行为。例如在某些外部注册表中注册,或检查某些内容的有效性。

所有这些公共代码都可以放在基类的构造函数中,并且它将从每个派生类的构造函数中隐式调用。

答案 2 :(得分:1)

如何抽象基类的构造函数可用于什么?

假设您有一个抽象基类B和一个派生类D.当创建一个D类型的对象时,首先调用B的构造函数,但此时,对象“仍”仍然是B类(参见{{ 3}}) - 特别是,从B的构造函数体调用任何虚函数将调用 B自己的那些函数的实现。但是如果B是纯抽象类,那么这些虚函数都没有定义,所以程序会立即崩溃。

我猜你打算让B的构造函数调用虚函数的最派生类(例如D')实现,对吧?这通常是一个坏主意,因为D的对象尚未完全构造,因此从D的虚函数实现中对D中成员变量的任何访问都将访问未初始化的内存。

答案 3 :(得分:1)

请记住:“资源获取是初始化”

有时我们使用抽象基类作为某种锁定机制。例如,在多线程环境中,多个线程需要共享单个资源,然后线程可以使用构造函数作为获取资源的方式,并使用析构函数来释放资源

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

雨果

答案 4 :(得分:1)

我想不出很多有用的例子。没有数据成员的类没有状态,因此无法初始化任何内容。但是,您可以让构造函数/析构函数为您进行日志记录。例如,要记录所有Visitor对象的创建/销毁:

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

答案 5 :(得分:0)

通常只是将成员初始化为明智的价值观。