本人新手,做书上的练习题遇到的麻烦。
问题背景:
要操作的是一个多重继承的派生类Wine,分别私有继承了一个标准string类和一个模板类Pair< T1,T2>,
其中T1、T2均具体化为std::valarray< int>,代码如下
// 模板类(作为基类)的定义
template <class T1, class T2>
class Pair {
private:
T1 a;
T2 b;
public:
...
T1 & first() { return a; }
T2 & second() { return b; }
T1 first() const { return a; }
T2 second() const { return b; }
Pair & operator=(Pair & rp);
};
template < class T1, class T2 >
Pair<T1, T2> & Pair<T1, T2>::operator=(Pair<T1, T2> & rp) {
a = rp.first();
b = rp.second();
return *this;
}
// 派生类的定义
typedef std::valarray<int> ArrayInt;
typedef Pair<ArrayInt, ArrayInt> PairArray;
class Wine : private string,private PairArray {
private:
int years;
public:
Wine(const char *lab, int y, int yr[], const int bot[]);
// 字符串lab填充继承来的string子对象,y填充years,
// yr[] 和 bot[] 都转换成ArrayInt,用来填充继承来的 Pair<ArrayInt, ArrayInt>
...
};
我的问题:
问题1:Wine的构造函数中可以对Pair< ArrayInt, ArrayInt>的两个ArrayInt对象分别赋值,但是为什么对Pair< ArrayInt, ArrayInt>作为一个整体的对象不能这么做?
Wine::Wine(const char *l, int y, int yr[], const int bot[]) : string(l), years(y) {
ArrayInt yr_temp(years), bot_temp(years);
for (int i = 0; i < years; i++) {
yr_temp[i] = yr[i];
bot_temp[i] = bot[i];
}
(*((PairArray*)this)).first() = yr_temp; // ok
(*((PairArray*)this)).second() = bot_temp; // ok
}
Wine::Wine(const char *l, int y, int yr[], const int bot[]) : string(l), years(y) {
ArrayInt yr_temp(years), bot_temp(years);
for (int i = 0; i < years; i++) {
yr_temp[i] = yr[i];
bot_temp[i] = bot[i];
}
(*((PairArray*)this)) = Pair(yr_temp, bot_temp); // invalid
}
(问题1的图片)
问题2:为什么必须用(*((PairArray*)this))而不能用(PairArray &)(*this),这两者有什么不同吗?
问题2的图片:
本人C++后进,若有前辈能不吝点拨一二,感激不尽