繁体   English   中英

带有两个构造函数的抽象类c ++

[英]Abstract class with two constructors c++

假设我有以下带有2个构造函数的Abstract类:

#ifndef ABSTRACTCLASS_H
#define ABSTRACTCLASS_H

#include <iostream>

using namespace std;

class AbstractClass
{
    public:
      AbstractClass(int);
      AbstractClass();
      virtual ~AbstractContext();
      //Pure virtual function
      virtual void doSomething() = 0;

    private:
        int  x;
};

#endif 

我有2个类将继承自AbstractClass

  1. A类将使用AbstractClass(int);
  2. B类将使用AbstractClass();

#ifndef A_H
#define A_H

class A: public AbstractClass
{
    public:
     A(int = 0);
     virtual ~A();
     virtual void doSomething();
    private:
     int xCoord;
}

#endif

A.cpp
#include "A.H"
A::A(int x):AbstractClass(x),xCoord(x) {}

void A::doSomething()
{
  cout << xCoord * xCoord << endl;
}

#ifndef B_H
#define B_H

    class B: public AbstractClass
    {
        public:
         B();
         virtual ~B();
         virtual void doSomething();
    }

    #endif

    B.cpp
    #include "B.H"
    B::B():AbstractClass() {}

    void B::doSomething()
    {
      cout << "nothing" << endl;
    }

  • 我在抽象类中使用2个构造函数是一个好习惯吗?
  • 遗产是否正确? 特别是我正在使用2个版本的构造函数?

如果这两个构造函数都可以应用于从ABC派生的(或将是一天)的每个类型,那么具有多个public构造函数的ABC是完全合适的。

也就是说, public基类构造函数仍然是类的接口的一部分。 如果这些构造函数中的一个或多个不适用于每个具体实例,那么理想情况下它们不应该是public接口的一部分。 将这些特殊构造函数设为private是一种改进,因为未来的程序员更难以错误地实现新的具体派生类型。

这是其他创作模式发挥作用的时候。 一种常见且简单的方法是在ABC上提供static成员函数以创建具体类型。 这是工厂方法模式的示例。

class A;
class B;

class AbstractClass 
{
public:
  static std::unique_ptr <AbstractClass> MakeA (int x)
  { 
    return std::make_unique <A> (x);  // You need to provide this, easily found
  }

  static std::unique_ptr <AbstractClass> MakeB ()
  {
    return std::m,ake_unique <B> ();
  }
  virtual ~AbstractClass();

private:
  AbstractClass ();
  AbstractClass (int x);
};

还有许多其他的创作模式; 这在我看来是最直观的。

这没什么不对。

您的基类有两种初始化方法,派生类使用最适合其实现的方法。 同样,他们可以选择提供自己的两个构造函数,这些构造函数映射到基类中的构造函数。

关键是两个构造函数都应该让这个类处于合理的状态。 因此,例如,基类中的默认构造函数应该将xCoord设置为某个合理值(可能为0),而我猜测AbstractClass(int)xCoord设置为传递给构造函数的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM