在c++中转换对象
Convert objects in c++
我不明白转换是如何工作的。。例如代码:
class Base
{
private:
int days;
public:
Base(int d):days(d){}
virtual void somefunc..
...
};
class DayInYear:public Base
{
public:
DayInYear(int diy):Base(diy){}
...
}
class Month:public Base
{
private:
int month;
public:
Mounth(int dm,int m):Base(dm),month(m){}
...
}
int main()
{
Base *arr[2] = {new DayInYear(100),new Month(20,4)};
...
}
我的问题是如何将Month类型转换为DayInYear类型?
编译器将无法为您自动转换类型,因为它们没有足够的相关性。
可以在Month
类中构建强制转换运算符。这将有原型
operator DayInYear() const;
并返回CCD_ 2对象。
然后可以编写(DayInYear)m;
,其中m
是Month
实例。
基本上有两种方法。
为DayInYear
创建一个构造函数,该构造函数采用Month
:
class DayInYear:public Base
{
public:
DayInYear(Month m) { //Create a DayInYear from Month }
...
}
或者,在Month
中创建一个提供DayInYear
:的强制转换运算符
class Month:public Base
{
public:
operator DayInYear() const { //create a DayInYear }
...
}
或者两者兼而有之。
当使用C风格的强制转换时,很多人会对此感到困惑:
Month m;
DayInYear day1 = DayInYear(m); //DayInYear constructor
DayInYear day2 = (DayInYear)m; //Cast Operator
当你说你不"理解转换是如何工作的"时,我假设你指的是这行代码:
Base *arr[2] = {new DayInYear(100),new Month(20,4)};
使用这行代码,从技术上讲没有进行转换,相反,这是多态性的概念。在C++等面向对象编程语言中,多态性指的是单个对象可以采用多种不同形式的想法。在上面显示的示例中,DayInYear和Month并没有真正转换为Base类型。这两个类都继承自基类,因此它们可以称为基类。DayInYear和Month持有的所有其他数据仍然存在,只是在被分配到其基类时无法访问。当这些对象被分配到其超类Base时,它们只能像Base对象一样进行交互,但在幕后,它们仍然是您创建它们的对象。多态性是这里的关键思想,也是面向对象编程中需要理解的一个非常重要的概念,您可以查看以下链接:http://www.cplusplus.com/doc/tutorial/polymorphism/
现在,对于您关于将Month转换为DayInYear的问题,我不确定您为什么要这样做。首先,一个月是一年中的一天是没有意义的,因为它们是非常不同的东西。这也可能导致数据丢失,因为Month包含Month属性,而DayInYear不包含。然而,如果你觉得需要进行这种转换,你会有几个选择。首先,在DayInYear类中有一个构造函数,它以Month作为参数来创建DayInYears对象:
DayInYear(Month month) { //Code that converts Month to DayInYear }
另一种选择是使用赋值运算符,该运算符允许直接将Month赋值为DayInYear:在您的DayInYear课程中:
DayInYear& operator = (const Month& month) { //code for assignment }
总的来说,你现在可以这样做:
Month month(2, 3);
DayInYear dayInYear = month;
最后一个选项是在Month类中使用类型转换运算符:
operator DayInYear() {//conversion code}
这将允许在两者之间进行铸造。
希望这能有所帮助。
- 在 C++ 中将对象转换为派生类型
- Swig无法将python3的字节对象转换为std::string
- 如何将 Python 对象转换为 Cython 扩展类型的 std::vector 并返回?
- 使用 c++ 将 2d CAD 对象转换为 TIFF 格式
- 将对象转换为指向对象的指针?
- 将使用基类 Ctor创建的对象转换为派生类
- C++中的重载歧义,用于自动将对象转换为"printable"格式
- 无法将类对象转换为函数默认参数中的参考
- 无法将对象转换为初始化中的对象*
- 使用提升序列化将类对象转换为矢量无符号字符<>
- 防止在执行时将两个类中的两个对象转换为 bool:if(a!=b)
- 如何在Cython中将Python对象转换为C++类型
- 重载运算符 -- 无法在赋值中将对象转换为基类型
- Cpp:Cpp中的JSON解析器,提供支持序列化/反序列化功能,将JSON对象转换为用户定义的类
- 如何将 'int *' 类型的 swig 对象转换为 ctypes int*
- 将对象转换为 char,然后"uncasting it back"
- 如何在C++中使用boost库将类对象转换为json字符串
- 在 c++ 中使用重载运算符将父对象转换为子对象
- 字符串流 - 将对象转换为字符串
- 将Mat对象转换为双arr(OpenCV)