0

假设我有两个班级,一和二。一和二本质上是一样的,但是二可以转换成一。

#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

二可以访问一,但一无权访问二。在 main.cpp 我有:

One a(4.5f, 5.5f);

Two b(10.5, 7.5);

One * c = &b;

如果我尝试将 One 的指针指向 Two 的地址,则会出现错误。错误是“错误 C2440:'正在初始化':无法从 '两个 *' 转换为 '一个 *'”

如果可能的话,我终其一生都无法弄清楚如何做到这一点。任何帮助,将不胜感激。

编辑:在 Two.h 中添加了一个新行,带有operator One& () const { return *this; }. 我试图用来让这个转换运算符工作的函数是void TestRefConstPrint(const One &testClass);下面的 main,这会出现一个新错误,即“无法将参数 1 从二”转换为“常量一 &”。

我在里面做:

int main()
{
    Two b(10.5, 7.5);

    TestRefConstPrint(b);

    return 0;
}
4

1 回答 1

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:它不创建新对象,它创建一个指向对象One所占用内存的指针Two。这通常是一个坏主意,您不太可能想要这样做。


最后,关于您的评论operator One*():它返回一个悬空指针(指向函数返回时超出范围的局部变量的指针)。我假设你写它是为了让Two* -> One*转换工作。您应该删除它,因为它不符合您的要求。

于 2012-05-31T00:50:22.737 回答