【问题标题】:Multiple constructor with different arguments具有不同参数的多个构造函数
【发布时间】:2011-03-08 15:46:28
【问题描述】:

我在网上遇到了这个问题,但不相信可变数量的参数或使用桥接模式解决方案,因此我在这里问这个问题。提前致谢。

class B
{
public:
B(args_1);
B(args_2);
// and many constructors with different arg lists
};

class D : public B
{
public:
D(args_1) : B(args_1) {}
D(args_2) : B(args_2) {}
// and many constructors with different signatures similarly implemented
// some additional stuff specific to D
};

假设 B 的构造函数的 arg 列表很长,可能是 将来经常修改,在这种情况下 D 的构造函数有 进行相应的重新编码。通过复制和粘贴复制更新 肯定会在这里工作。你能提出一个更好的方法,以便 无需复制粘贴即可在一处完成更新?

【问题讨论】:

  • 是否需要继承(ergo 多态行为)?
  • 如果您的编译器支持任何 C++0x 功能,请考虑stackoverflow.com/questions/3119929/…
  • 为了争论,我们说是的。但是我愿意看到非多态解决方案。正如我所提到的,这只是我从网上挑选的一个假设问题。
  • 如果你使用 B 来定义多个类的接口,你就不能拥有一长串经常变化的参数。你必须先决定一个接口,然后再实现它。否则做很多工作,不仅要更新构造函数,还要修改所有子类,想必会使用基类中的附加数据。

标签: c++


【解决方案1】:

当然,使用组合而不是继承:

class D{
public:
   D(auto_ptr<B> _obj) : mB(_obj){}
   //member functions which delegate to the calls of "B"
   //member functions specific to "D"
private:
   scoped_ptr<B> mB;
};

【讨论】:

  • +1 当您希望事物以多态方式运行时,才需要继承。除非您必须继承,否则请撰写。
  • 考虑D(std::auto_ptr&lt;B&gt; _obj),它是一个接收器(将获得所有权)。另外,我怀疑const 是错误的。
  • @Andres Jaan Tack 完全正确。 @MSalters 完成了,你对 const 的看法是正确的,应该是 B* const 而不是 const B*。前者是可以改变B状态的指针,后者不能。
  • 我再也看不到任何“常量”了。您可以保留您发送的第一个版本,并在其下方加上“编辑:”的更正版本吗?然后可以理解这里的这个 const-discussion 并且人们(像我一样)可以从中学习。像这样,就是留下一个大大的“?”
【解决方案2】:

让编译器在需要时进行生成:

template<typename T1> D(T1 t) : B(t1) { };
template<typename T1, typename T2> D(T1 t, T2 t2) : B(t1, t2) { };

【讨论】:

    【解决方案3】:

    创建另一个封装参数的类 A,然后将其传递给 D。

    class A
    {
       int foo;
    };
    
    class A1: public A
    {
       float bar;
    };
    
    
    class B
    {
        B(const A& args);
    };
    
    class D: public B
    {
        D(const A& args) : B(args)
        {
           // do more stuff
        }
    };
    

    【讨论】:

    • 假设 B 和 D 关心更改,您是否还需要在每次更改 arg 时都编辑 B 和 D 的构造函数?
    • @reuscam :不,但他可能不得不编辑 A 和 B。 :-)
    • @reuscam:我想我不明白你的评论——如果 D 关心变化并需要对它做出反应,那么你必须为此“付费”。我的建议是在 D 并不真正关心发送给 B 的情况下提供帮助。显然,如果您想更改参数...您必须更改参数 - 无论是列表还是结构中的成员.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多