【问题标题】:C++ operator -> in complex numbers case [closed]C ++运算符->在复数情况下[关闭]
【发布时间】:2018-06-19 07:45:21
【问题描述】:

问题是实现类 Cplx 与两个双精度 xy 代表复数的实部和虚部。
子任务之一是实现operator ->,描述如下:

(z­->rez­->im):访问z的实部和虚部(你必须像z->re = 5一样实现改变)。

我对@9​​87654330@ 有疑问,我从来没有真正理解它是如何工作的,所以我的问题是:-> 是如何工作的,何时使用它以及如何在这个问题中应用这个想法。

【问题讨论】:

  • 讲座中没有提到 pointer to member 运算符吗?
  • 如果你真的必须将双打命名为xy,实现z->re 的行为会相当复杂。 (或者我误解了任务描述,说实话很难理解。)
  • @idmean:没那么复杂,但很奇怪。

标签: c++ class operator-overloading complex-numbers


【解决方案1】:

以下内容可以满足您的要求...但不确定是否是您想要的:

template <typename T>
struct ReIm
{
    const ReIm* operator ->() const { return this; }
    ReIm* operator ->() { return this; }

    T re;
    T im;
};


struct Cplx
{
    double x;
    double y;

    ReIm<double> operator ->() const { return {x, y}; }
    ReIm<double&> operator ->() { return {x, y}; }
};

Demo

【讨论】:

  • 不错。要走的路。
  • 这就是我的想法,在我看来,与其好处相比,它似乎过于复杂。另一方面,这可能只是一个练习。
  • 我认为 OP 更有可能误解或未能正确地呈现他们的任务。但是,有时即使是最晦涩的需求也可以在 C++ 中完成,这总是很有趣。
【解决方案2】:

-> 运算符用于取消引用指向对象的指针并在一个运算符中获取成员变量/函数。例如,

Cplx* cplxPointer = new Cplx();
cplxPointer->x = 5;

是一样的

Cplx* cplxPointer = new Cplx();
(*cplxPointer).x = 5;

它只是取消引用指针,然后获取成员变量(或函数,如果你想)。除非我误解了您的问题,否则以上内容应该可以帮助您完成作业。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2012-09-24
    相关资源
    最近更新 更多