说我有两个班,一个和两个。一个和两个基本相同,但两个可以转换成一个。
#ifndef _ONE_H_
#define _ONE_H_
class One
{
private:
float m_x;
float m_y;
public:
One();
One(float x, float y);
};
#endif
#ifndef _TWO_H_
#define _TWO_H_
#include "One.h"
class Two
{
private:
float m_x;
float m_y;
public:
Two();
Two(float x, float y);
operator One() { return One(m_x, m_y); }
operator One* () { return &One(m_x, m_y); }
operator One& () const { return *this; }
float GetX(void) { return m_x ;}
float GetY(void) { return m_y ;}
void Print();
};
#endif
两个人可以访问One,但One无法访问Two。在main.cpp中我有:
One a(4.5f, 5.5f);
Two b(10.5, 7.5);
One * c = &b;
如果我尝试将One的指针指向Two的地址,则会出错。错误是“错误C2440:'初始化':无法从'两个*'转换为'一个*'”
如果有可能的话,我不能为我的生活弄清楚如何做到这一点。任何帮助将不胜感激。
编辑:使用operator One& () const { return *this; }
向Two.h添加了一个新行。我试图用来使这个转换运算符起作用的函数是void TestRefConstPrint(const One &testClass);
对于下面的main,这为“无法将参数1从两个'转换为'const One&'而出现了新的错误。
我在做主要内容:
int main()
{
Two b(10.5, 7.5);
TestRefConstPrint(b);
return 0;
}
答案 0 :(得分:1)
您的转换运算符可启用转化Two -> One
和Two -> One*
。您正尝试执行其他转化Two* -> One*
。
要使用operator One()
转换运算符执行Two -> One
转换,只需执行以下操作:
One c = b;
如果你真的想进行Two* -> One*
转换,可以使用明确的演员:
One * c = (One *)&b;
或使用C ++风格的演员阵容:
One * c = reinterpret_cast<One *>(&b);
但请注意,这不使用任何转换运算符,并且与Two -> One
转换完全不同:它不会创建新对象,而是指向指针 - {{ 1}}指向One
对象占用的内存。这通常是一个坏主意,你不太可能想要这样做。
最后,关于你的Two
的评论:它返回一个悬空指针(指向一个局部变量的指针,该函数在函数返回时超出范围)。我假设您在试图让operator One*()
转换工作时编写了它。你应该删除它,因为它没有你想要的。