用朋友类重载构造函数

时间:2011-04-12 13:13:03

标签: c++ class constructor overloading friend

我有一个类,它使用静态列表(示例中为firstFriend)或动态列表(示例中为secondFriend)进行初始化。我不想为该示例编写的列表功能,因为它并不重要。关键问题是,第一个朋友和第二个朋友是好朋友。类“target”的构造函数的代码是相同的:如果我重载构造函数,我正在复制完全相同的代码。我无法模拟构造函数,因为它不起作用。

这是示例(注意:firstFriend和secondFriend看起来可能相同,但它们在ACTUAL代码中不一样,这只是一个大大减少的模型,它们的属性和功能之间的差异没有任何不同之处“target”类构造函数,因为公共接口的各个部分都使用两个完全相同的类:)

template <class T>
class firstFriend 
{
    public:
    firstFriend() {};

    firstFriend(const T& t) {};

    private:
    T tAttribute; 
};


template <class T>
class secondFriend 
{
    public:

    secondFriend() {};

    secondFriend(T t) : tAttribute(t) {};

    friend class firstFriend<T>;

    private:

        T tAttribute;
};

class target
{
    public:
    target(const firstFriend<int>&) 
    {
        // Some nice initialization of the TargetData.
    }
    target(const secondFriend<int>&)
    {
        // Exactly the same initialization as above. 
        // To the single character. 
    }; 
    private:
    firstFriend<int> TargetData;
};

问题:如何在不编写(复制/粘贴)相同代码两次的情况下重载构造函数?我试过模板构造函数,但它不起作用。隐性演员可能吗?什么是最有效的方式(firstFriend和secondFriend是巨大的数据列表)。提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果两个构造函数具有完全相同的代码,则可以将构造函数模板编写为:

template<class FriendType >
target(const FriendType &) 
{
    // Some nice initialization of the TargetData.
}

如果存在一点差异,但大多数代码相同,那么您可以编写init模板函数,并从两个构造函数中调用它:

  target(const firstFriend<int>& arg) 
  {
     init(arg);
     //other code
  }
  target(const secondFriend<int>& arg)
  {
     init(arg);
     //other code
  }
private:
  template<class FriendType >
  void init(const FriendType &) 
  {
     //common code
  }