【问题标题】:Redefining Friend Function of Base Class in Derived Class在派生类中重新定义基类的友元函数
【发布时间】:2013-12-30 20:31:22
【问题描述】:

我想在派生类BigNum 中重新定义最初在Vector 类中定义为友元的operator* 函数。具体来说,我想调用operator*Vector 版本,然后在BigNum 的运算符* 中对该操作的结果执行一些其他操作。这是结构的 sn-p(再次感谢 @lemmes 提供的帮助):

template<typename T>
class Vector
{
private:
  std::vector<T> base;

public:                                                                                                                 
  Vector();                                                                                                                        
  Vector(const std::vector<T> vec);                                                                                                
  Vector(const Vector& vec);

  template<typename T1, typename T2>
  friend auto operator*(const Vector<T1>& lhs, const Vector<T2>& rhs) -> Vector<decltype(std::declval<T1>() * std::declval<T2>())>;
};

template<typename T1, typename T2>
auto operator*(const Vector<T1>& lhs, const Vector<T2>& rhs) -> Vector<decltype(std::declval<T1>() * std::declval<T2>())>
{
  typedef decltype(std::declval<T1>() * std::declval<T2>()) T3;
  assert(lhs.base.size() == rhs.base.size());
  Vector<T3> result;
  result.base.reserve(lhs.base.size());
  std::transform(lhs.base.begin(), lhs.base.end(), rhs.base.begin(), std::back_inserter(result.base),
                 [](const T1& e1, const T2& e2) { return e1 * e2; });
  return result;
}

class BigNum : public Vector<int>
{
 public:
  BigNum();
  BigNum(const std::vector<int> init);
  ~BigNum();

  BigNum operator*(const BigNum& rhs);
};
#endif

BigNum BigNum::operator*(const BigNum& rhs)
{

  // How can I call Vector's operator* (a friend of the Vector class)                                                                            
  // and then do other stuff in here?                                                                                                            
}

#include "BigNum.h"

int main()
{

  int arr1[] = {1,2,3,4,5};
  int arr2[] = {10,20,30,40,50};
  std::vector<int> vec1 (arr1, arr1 + sizeof(arr1) / sizeof(arr1[0]));
  std::vector<int> vec2 (arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]));

  BigNum bn1(vec1), bn2(vec2);

  bn1 * bn2;  // want to call BigNum's operator* here

  return 0;
}

我显然不能做像Vector::operator* 这样的事情,因为它是一个朋友。提前致谢!

【问题讨论】:

    标签: c++ inheritance friend derived-class


    【解决方案1】:

    您可以编写static_cast&lt;Vector&lt;int&gt;&amp;&gt;(bn1) * static_cast&lt;Vector&lt;int&gt;&amp;&gt;(bn2) 来调用向量的重载运算符。

    【讨论】:

    • 酷,我将它添加到BigNumoperator+ 的定义中,但为什么我不能将结果分配给BigNum 对象?即我想返回一个 BigNum 对象,所以我想做 `BigNum result =static_cast&>(bn1) * static_cast&>(bn2)
    • @David:谁说你不能?编写适当的构造函数。但这听起来很疯狂。
    • 我写了一个复制构造函数,但我仍然收到错误“从 'Vector' 转换为非标量类型 'BigNum' 请求
    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2015-05-01
    • 2014-04-04
    相关资源
    最近更新 更多