首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从构造函数-有条件地调用成员变量的构造函数重载。

从构造函数-有条件地调用成员变量的构造函数重载。
EN

Stack Overflow用户
提问于 2013-11-06 20:20:45
回答 1查看 1.8K关注 0票数 2

背景:

我想做的是类似于以下内容(代码不起作用):

代码语言:javascript
复制
class A {
public:
  A(TypeX a)
  {
    /* initialize using TypeX */
  }
  A(TypeY a)
  {
    /* initialize using TypeY */
  }
};


class B {
private:
  A a;
  static const TypeX x;
  static const TypeY y;

public:
  B(bool useTypeX)
    : a(useTypeX ? x : y)
  {}
};

TypeX B::x;
TypeY B::y;

这将是我想要的代码(如果语言支持它),但是B::a的初始化程序列表结构中的三元操作符在编译时不会对两种不同类型执行重载解析(请参见:https://stackoverflow.com/a/8535301/1689844)。

请注意,我只控制B级的设计。类A、TypeX和TypeY是完全不同的类型,超出了我的控制范围(同时,TypeX和TypeY不共享公共基类,也不能将TypeX转换为TypeY,反之亦然)。而且,A类初始化成本很高(因此复制构造函数是不可行的)。

问题:

我想知道是否有人知道比B类的以下实现更优雅的解决方案来实现我想要的行为:使用C++11特性的答案是受欢迎的,但我仅限于使用C++03,因此我只接受使用C++03特性的答案:

代码语言:javascript
复制
class B {
private:
  SomeSmartPointer<A> a;
  static const TypeX x;
  static const TypeY y;

public:
  B(bool useTypeX)
  {
    // SomeSmartPointer is a smart pointer
    //    which uses reference-counting to
    //    delete allocated memory when the
    //    reference count is 0 and it is
    //    copy-constructable
    if (useTypeX)
    {
      SomeSmartPointer<A> tmp(x);
      a = tmp;
    }
    else
    {
      SomeSmartPointer<A> tmp(y);
      a = tmp;
    }
  }
};

TypeX B::x;
TypeY B::y;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 20:30:51

如果A是可复制的(或者是可移动的,但这不相关,因为您没有使用C++11),那么您可以这样做

代码语言:javascript
复制
class B {
private:
  A a;
  static const TypeX x;
  static const TypeY y;
  static A initA(bool useTypeX)
  {
    if (useTypeX)
       return A(x);
    else
       return A(y);
  }
public:
  B(bool useTypeX)
    : a(initA(useTypeX))
  {}
};

编辑:当然,考虑到这一点,这是合法的,不需要额外的功能。关键是要显式地创建它们。请参阅https://ideone.com/yUIF0Z

代码语言:javascript
复制
B(bool useTypeX) : a( useTypeX ? A(x) : A(y) ) {}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19822007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档