【发布时间】:2014-12-12 12:26:44
【问题描述】:
#include <iostream>
using namespace std;
// Assignment operator: allow implicit conversion from a particular type on assignments.
// Type-cast operator: allow implicit conversion to a particular type.
class car;
class bus
{
public:bus & operator = (car & b)
// implicit conversion by assignment operator
{
cout << endl << "Assignment operator of BUS " << endl;
return *this;
}
/* operator car () const // Type-cast operator
{
return (car ()); // error: invalid use of incomplete type ‘class car’
}*/
};
class car
{
public:
car ()
{
}
car (const bus & b1)
{
cout << endl << "conversion constructor";
}
car & operator = (bus & b) // implicit conversion by assignment operator
{
cout << endl << "Assignment operator of car " << endl;
return *this;
}
operator bus () const // Type-cast operator
{
cout << endl << "Typecast operator-in car" << endl;
return (bus ());
}
};
int
main ()
{
bus b;
car c1 = b; // call convertion constructor of car object
c1 = b; // call assignment operator of car
// or
b = c1; // call assignment operator of bus
car c2;
bus b2 = bus (c2); //call Type-cast operator of car`enter code here`
// we cannot define Type-cast operator in bus
// eventhough forward decleration is done
// error: invalid use of incomplete type ‘class car’
// so car c=car(b) is not possible
我的问题是从用户定义类型到另一种类型的隐式转换 1) 如果在两者中声明的赋值运算符都可以用于 bus = car 和 car = bus 那么为什么要使用复杂的 Type-cast 操作符语法呢?有什么区别吗 如果是这样的话 ? 2)上面提到的复制构造函数和转换构造函数之间是否有任何关系,我注意到的一个相似之处是在分配时调用和传递参数的复制构造函数和转换构造函数是不同的。是否有其他差异或相似之处。 3)虽然前向减速完成了,但是代码被注释了一个错误:“invalid use of incomplete type ‘class car’”,为什么?
提前致谢
【问题讨论】:
-
你有一个不可能的循环:你的
bus类需要一个完全定义的car类,而car类需要一个完全定义的bus类。你需要找到一种方法来打破这个循环,也许是通过一个通用的基类(感觉很自然,bus和car都会继承类似vehicle之类的东西),也许这个基类可以是使用Curiously recurring template pattern。 -
@JoachimPileborg 我不明白为什么你不能只为这个使用类外成员函数定义。
-
@T.C.当然,我只是不确定类型转换运算符的实际声明是否也需要完整的定义。
标签: inheritance c++11 constructor