我怎样才能在c ++中做第二个类似的构造函数?

时间:2014-08-02 09:46:24

标签: c++ inheritance c++11 constructor

我有一个class Aclass BB这里是A的子类:

class A {
 public:
  A(int a) : obj(a) {}
  void init() {
    if(magic_str == "hello") {
      // do init c
      c = 7;
    }
  }
 private:
   int obj;
   int c;
 protected:
   string magic_str;
};

class B : public A {
 public:
  B(int a, double _b) : A(a), b(_b){}
  void set_magic_str() {
    magic_str = "hello";
  }
 private:
   double b;
};

上面,init中的A函数必须在A中构建,但必须在magic_str初始化后调用。必须在magic_str中初始化class B,因为有一些用户定义的逻辑。

如何强制Binit中调用A

总而言之,我想将A中的构造函数代码分成两部分,在这两部分之间,必须在他的子类B中初始化一些用户定义的行为。

4 个答案:

答案 0 :(得分:4)

一种方法是将魔术字符串作为构造函数传递给A构造函数,并在构造函数中调用init。

class A {
 public:
  A(int a, string m) : obj(a), magic_str(m) 
  { 
      init();
  }
  void init() {
    if(magic_str == "hello") {
      // do init c
      c = 7;
    }
  }
 private:
   int obj;
   int c;
 protected:
   string magic_str;
};

class B : public A {
 public:
  B(int a, double _b) : A(a,get_magic_str()), b(_b){}
  static string get_magic_str() {
    return "hello";
  }
 private:
   double b;
};

答案 1 :(得分:0)

另一种方法是使用builder pattern并让它处理您希望创建对象的复杂方式:

class A {
 public:
  A(int a) : obj(a) {}
  void init() {
    if(magic_str == "hello") {
      // do init c
      c = 7;
    }
  }
 private:
   int obj;
   int c;
 protected:
   string magic_str;
};

class B : public A {
 public:
  static B create (int a, double _b) // <-- only allow instances to be created via this function
  {
      B b = B(a, _b);
      b.init();
      return b;
  }
  void set_magic_str() {
    magic_str = "hello";
  }
 private:
  B(int a, double _b) : A(a), b(_b){} //maybe protected
   double b;
};

答案 2 :(得分:0)

由于init是A的非私有成员函数,B是从A派生的,因此可以调用init。 设置magic_string之后调用它,例如。构造函数。

    A::init();

否则,请更改A的构造函数,并在B中使用它。

    A(int a, string s)
    B(int a, double _b): A (a, magic_str)...

答案 3 :(得分:0)

我会将逻辑更改为:

class A {
public:
    A(int a) : obj(a), c(0) {}
protected:
    void set_magic_str(const std::string& s) {
        magic_str = s;
        if (magic_str == "hello") {
            // do init c
            c = 7;
        }
    }
private:
    int obj;
    int c;
    std::string magic_str;
};

class B : public A {
public:
    B(int a, double _b) : A(a), b(_b){}
    void set_magic_str() {
        A::set_magic_str("hello");
    }
private:
    double b;
};