0

私は次のコードを持っています

#include<math.h>
class complex
{

public:
    double getRe();
    double gerIm();
    void setRe(double value);
    void setIm(double value);
    explicit complex(double=0.0,double=0.0);
    static complex fromPolar(double radius,double angle);
    complex operator+(complex rhs);
    complex operator-(complex rhhs);
    complex operator*(complex rhs);
    complex operator+(double rhs);
    complex operator-(double rhs);
    complex operator*(double rhs);
    complex conjugate();
    double norm();
    complex operator/(double rhs);
    complex operator/(complex rhs);

private:
    double real;
    double img;

};
complex operator+(double lhs,complex rhs);
complex operator-(double lhs,complex rhs);
complex operator*(double lhs,complex rhs);
complex operator/(double lhs,complex rhs);
complex exp(complex c);
inline double complex::getRe(){return real;}
inline double complex::gerIm(){ return img;}
inline void complex::setRe(double value) {  real=value;}
inline void complex::setIm(double value) { img=value;}
 inline complex::complex(double re,double im) :real(re),img(im){}
 inline static  complex complex::fromPolar(double radius,double angle){

     return complex(radius*cos(angle),radius*sin(angle));

 }
 inline complex complex::operator+(complex rhs)
 {
     return complex(this->real+rhs.real,this->img+rhs.img);

 }
 inline complex complex::operator-(complex rhs)
 {
     return complex(this->real-rhs.real,this->img-rhs.img);

 }
 inline complex complex::operator*(complex rhs)
 {
     return complex(this->real*rhs.real-this->img*rhs.img,this->real*rhs.img+this->img*rhs.real);

 }
 inline complex complex::operator+(double rhs)
 {
     return complex(this->real+rhs,this->img);

 }

 inline complex complex::operator-(double rhs)
 {
     return complex(this->real-rhs,this->img);

 }
 inline complex complex::operator*(double rhs)
 {
     return complex(this->real*rhs,this->img*rhs);

 }
 inline complex complex::operator/(double rhs)
 {
     return complex(this->real/rhs,this->img/rhs);

 }
 inline complex complex::operator/(complex rhs)
 {

     return (*this)*rhs.conjugate()/rhs.norm();


 }

 inline double complex::norm()
 {
 return (this->real*this->real+this->img*this->img);
 }

 inline complex complex::conjugate()
 {

     return complex(this->real,-this->img);
 }


 inline complex operator+(double lhs,complex rhs)
 {
     return rhs+lhs;
 }

 inline complex operator-(double lhs,complex rhs)
 {
     return complex(lhs-rhs.getRe(),rhs.gerIm());

 }
 inline complex operator*(double lhs,complex rhs)
 {
     rhs*lhs;

 }

 inline complex operator/(double lhs,complex rhs)
 {
     return rhs.conjugate()*lhs/rhs.norm();

 }

しかし、それは言う

1>c:\users\daviti\documents\visual studio 2010\projects\complex_number\complex_number\complex.h(38): error C2724: 'complex::fromPolar' : 'static' should not be used on member functions defined at file scope

static キーワードを削除すると正常にコンパイルされますが、この static キーワードをクラス定義で使用しているため、削除してもエラーにはなりませんか?

4

2 に答える 2

5

staticメソッドを実装する場所ではなく、クラス定義にのみ表示する必要があります。

class complex
{
    //......
    static complex fromPolar(double radius,double angle);
    //.....
};

inline complex complex::fromPolar(double radius,double angle){
     return complex(radius*cos(angle),radius*sin(angle));
}
于 2012-04-21T09:55:43.367 に答える
1

@Luchianは質問に十分に答えました。の代替案について説明しfromPolarます。

おそらく、あなたはこれを書くことができないことをすでに知っています:

class complex
{
    //..
    explicit complex(double real, double imaginary);
    explicit complex(double radius, double angle); //same as above
};

2 番目のコンストラクターは基本的に最初のコンストラクターと同じです (パラメーターの名前が異なっていても違いはありません)。これを行うことはできませんfromPolar

しかし、解決策にも微妙な問題が残っています。角度パラメータfromPolarの単位は何ですか? それはラジアンですか、度ですか、それとも何ですか?

fromPolarしたがって、上記の両方の問題を解決し、関数が不要になる次のクラスを提案します。

class complex
{
    //..
    explicit complex(double real, double imaginary);
    explicit complex(double radius, Angle angle); //now it is different
};

ここで、Angle次のように定義された別のクラスです。

class Angle 
{
  double m_value; //always maintain this in radian

 public:
  Angle(double value, bool isradian = true);

  double radian(){ return m_value; }
  double degree(){ return m_value * 180 / PI; }//or maybe M_PI is the symbol
};

あなたのクラスが少し良くなることを願っています。

于 2012-04-21T10:24:05.903 に答える