【问题标题】:Passing a method as constructor parameter将方法作为构造函数参数传递
【发布时间】:2011-09-04 05:28:44
【问题描述】:

我一直在尝试创建一个 Cmplx 类型的新变量(这是我的类名),其数据值为 0 和 arg()(arg 是我类的方法) 事情是结果变量的值为0,0。 有什么解决办法还是我做错了什么?

另外,代码:

#pragma once
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

template <typename vartype>
class Cmplx
{
public:
vartype Re, Im;
Cmplx(vartype const Real, vartype const Imag)//constructor
{
    Re=Real;
    Im=Imag;
}
long double arg()//called method
{
    return atan2(Im,Re);
}
long double abs()
{
    return sqrt(pow(Re,2)+pow(Im,2));
}
Cmplx<long double> log()//target method
{
    Cmplx<long double> IArg(0,arg());
    return IArg+log(abs());
}
Cmplx operator +(Cmplx const param)
{
    Cmplx Tmp;
    Tmp.Im=Im+param.Im;
    Tmp.Re=Re+param.Re;
    return Tmp;
}
Cmplx operator +(vartype const param)
{
    Cmplx Tmp;
    Tmp.Re=Re+param;
    return Tmp;
}
friend Cmplx operator +(vartype const param, Cmplx const para)
{
    Cmplx Tmp;
    Tmp.Re=para.Re+param;
    return Tmp;
}
friend ostream& operator << (ostream &tmp, Cmplx const &param)
{
    tmp<<param.Re<<"+"<<param.Im<<"i";
    return tmp;
}
friend istream& operator >> (istream &tmp, Cmplx &param)
{
    tmp>>param.Re;
    tmp>>param.Im;
    return tmp;
}
};
template <>
class Cmplx<string>
{
public:
Cmplx()
{
    cout << "Are you crazy or something?, a complex NUMBER with LETTERS as real part and imaginary part?"
    << "\n" << "Damn you should go to school dude." << endl;
}
};
template <>
class Cmplx<char>
{
public:
Cmplx<string> tmp;
};

template <typename type>
long double abs(Cmplx<type> param)
{
    long double tmp;
    tmp=sqrt(pow(param.Re,2)+pow(param.Im,2));
    return tmp;
}
template <typename type>
long double arg(Cmplx<type> param)
{
    return atan2(param.Im,param.Re);
}
template <typename type>
Cmplx<long double> exp(Cmplx <type> param)
{
    Cmplx<long double> tmp, exim(cos(param.Im),sin(param.Im));
    tmp=exp(param.Re)*exim;
    return tmp;
}
template <typename type>
Cmplx <long double> log(Cmplx<type> param)
{
    Cmplx<long double> IArg(0,arg(param));
    return IArg+log(abs(param));
}
template <typename type, typename paramT>
Cmplx<long double> log_b(Cmplx<type> arg, paramT param)
{
    return log(arg)/log(param);
}

该类的实现:

#include"cmplx oper.hpp"
using namespace std;

int main()
{
Cmplx<long double> A(2,3);
cout << log(A);
getch();
return true;
}

结果是:1.28247+0i 但它应该是1.28247+0.98279i

【问题讨论】:

    标签: c++ methods constructor


    【解决方案1】:

    看起来您实际上并不想传递方法本身 - 您想调用该方法并将返回的值传递给构造函数。这正是你在这里所做的,应该没问题。换句话说,你所拥有的已经大致相当于:

    Cmplx<long double> log()
    {
        long double tmp = arg();
        Cmplx<long double> IArg(0, tmp);
        return IArg + log(abs());
    }
    

    我怀疑还有其他问题 - 例如您的对象没有您认为它开始使用的数据。我建议你在调试器中单步调试代码,添加一些诊断日志记录,或者添加一些单元测试来验证这个类,然后再验证它的使用情况。

    (顺便说一句,对像这样的变量使用 Pascal-case 对我来说看起来很奇怪。我还没有看到任何 C++ 约定可以做到这一点......)

    编辑:我怀疑这是问题所在:

    friend Cmplx operator +(vartype const param, Cmplx const para)
    {
        Cmplx Tmp;
        Tmp.Re=para.Re+param;
        return Tmp;
    }
    

    请注意,除了para.Re 之外,您从不使用para 的任何部分,并且根本不分配给Tmp.Im。我怀疑你想要:

    friend Cmplx operator +(vartype const param, Cmplx const para)
    {
        Cmplx Tmp = para;
        Tmp.Re += param;
        return Tmp;
    }
    

    或者可能只是:

    friend Cmplx operator +(vartype const param, Cmplx const para)
    {
        return Cmplx(para.Re + param, para.Im);
    }
    

    【讨论】:

    • 谢谢,我不太清楚如何使用调试器,但我尝试调用 arg() 方法本身,它给了我应该给的东西。
    • @Juan:我会花一些时间来学习如何使用调试器来做一件事。但是如果arg() 做对了,那么你应该检查一下你的 + 运算符做了什么......
    • 我认为操作符不是问题,因为它能够为数字的Re部分分配一个数字,实际上是*this的绝对值的自然对数。用代码写成 [log(abs(*this))]
    • @Juan:嗯,你现在不知道问题在哪里,所以不要打折扣。如果您不想使用调试器,请在您的代码中添加“打印”语句,这样您就可以看到log() 中涉及的每一步发生了什么。你有一个简短但完整的程序来演示这个问题吗?如果是这样,那肯定会有所帮助。
    • @Juan:查看我的编辑...尽管我不确定是否调用了操作员。我本来希望看到operator +(Cmplx const para, vartype const param)。也许 C++ 假设它可以切换参数 - 我远非 C++ 专家。
    猜你喜欢
    • 2015-08-02
    • 2016-07-19
    • 2014-09-10
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多