加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 基于另一个数据成员的类数据成员类型?

发布时间:2020-12-16 10:03:53 所属栏目:百科 来源:网络整理
导读:假设我有一个基类foo和两个派生类A和B.然后我有另一个类吧,它有一个数据成员x,y,z,可以是A,或者,但是类型取决于其他数据成员x_type,y_type和z_type,这些值在编译时不可用.我虽然使用模板数据成员并在构造函数中定义类型,但我得到了类型的值,但显然至少在C 11
假设我有一个基类foo和两个派生类A和B.然后我有另一个类吧,它有一个数据成员x,y,z,可以是A,或者,但是类型取决于其他数据成员x_type,y_type和z_type,这些值在编译时不可用.我虽然使用模板数据成员并在构造函数中定义类型,但我得到了类型的值,但显然至少在C 11中是不可能的.那么如何继续?

class foo{
public:
  foo(double);
  int x_type;
  virtual double do_something(double,int) = 0;
};

class A: public foo {
public:
  A(double,double);
  double do_something(double,int);

private:
  double z1;
  double z2;
};

class B: public foo {
public:
  B(double);
  double do_something(double,int);

private:
  double w;
};

class bar {
public:
  bar();
  double do_something2(int);

private:
  int x_type;
  int y_type;
  int x_type;
  x; // these are either A or B...
  y;
  z;
};

在构造函数中我会有类似的东西

if(x_type == 1){
  x = A(arg1,arg2);
} else {
  x = B(arg3);
}

在我的实际应用程序中,可能会有更多数量的派生类和具有未知类型的数据成员.我想知道是否可以使bar成为具有多个模板参数的模板类,但我不确定这是否可能因为参数类型依赖于另一个参数?

解决方法

您需要使用多态并利用公共基类Foo:

private:
  int x_type;
  int y_type;
  int x_type;
  std::unique_ptr<Foo> x; // these are either A or B...
  std::unique_ptr<Foo> y;
  std::unique_ptr<Foo> z;

};

然后在构造函数中,您可以从正确的类型创建x y z:

if(x_type == 1){
  x.reset(new A(arg1,arg2));
} else {
  x.reset(new B(arg3));
}

在所谓的“工厂”类或函数中移动创建正确Foo实例的代码是一种很好的做法,以隐藏决策逻辑和构造细节(有时可能非常复杂).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读