指针转换,无法将两个*转换为一个*

时间:2012-05-31 00:47:44

标签: c++ conversion-operator

说我有两个班,一个和两个。一个和两个基本相同,但两个可以转换成一个。

#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;
}

1 个答案:

答案 0 :(得分:1)

您的转换运算符可启用转化Two -> OneTwo -> 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*()转换工作时编写了它。你应该删除它,因为它没有你想要的。