C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 基于另一个数据成员的类数据成员类型?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个基类foo和两个派生类A和B.然后我有一个类吧,它有一个数据成员x,y,z,可以是A,或者,但是类型取决于其他数据成员x_type,y_type和z_type,这些值在编译时不可用.我然使用模板数据成员并在构造函数中定义类型,但我得到了类型的值,但显然至少在C 11中@R_673_8351@.那么如何继续?

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实例的代码是一种很好的做法,以隐藏决策逻辑和构造细节(有时可能非常复杂).

大佬总结

以上是大佬教程为你收集整理的c – 基于另一个数据成员的类数据成员类型?全部内容,希望文章能够帮你解决c – 基于另一个数据成员的类数据成员类型?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。