Передача метода в качестве параметра конструктора - PullRequest
0 голосов
/ 29 мая 2011

Я пытался создать новую переменную типа 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

1 Ответ

2 голосов
/ 29 мая 2011

Похоже, что вы на самом деле не хотите передавать сам метод - вы хотите вызвать метод и передать возвращенное значение в конструктор. Это именно то, что вы делаете здесь, и это должно быть хорошо. Другими словами, то, что у вас есть, уже в целом эквивалентно:

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

Я подозреваю, что что-то еще идет не так, как, например, у вашего объекта нет данных, с которых вы думаете, что он имеет для начала. Я предлагаю вам пройтись по коду в отладчике, добавить некоторые диагностические журналы или добавить несколько модульных тестов для проверки этого класса, а затем всех, кто его использует.

(Кроме того, для меня странно использовать регистр Pascal для таких переменных, как эта. Я не видел никаких соглашений C ++, которые делают это ...)

РЕДАКТИРОВАТЬ: Я подозреваю, что это проблема:

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

Обратите внимание, что вы никогда не используете какую-либо часть para, кроме para.Re, и никогда не назначаете 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...