5

ここy=ax^2 + bx + ca、 、bcは定数でxあり、変数です。これが私のクラスです:

class quadratic {
public:
double evaluate(const double x);
void getCoefficients (double &A, double &B, double &C);
void setCoefficients (const double A, const double B, const double C);

private:
double a;
double b;
double c;
};

以下が有効になるように、クラスに 2 つのコンストラクターを作成します。

quadratic y1 = quadratic(1.0, -5.0, 7.0);
quadratic y2 = quadratic(-3.0, -2.0, 10.0);
quadratic y3;

デフォルトのコンストラクターはゼロに設定する必要がありますが、2 番目のコンストラクターのパラメーターは係数の初期値を示します。

これが私がそうすべきだと私が信じる方法です:

quadratic()   //default values
{
double A, double B, double C = 0.0;
}

quadratic(double A, double B, double C)   //initial values
{
double A = double a;
double B = double b;
double C = double c;
}

しかし、私はこれを設定する方法を完全には理解していません。

4

4 に答える 4

20

代わりに、おそらくコンストラクターの初期化リストを使用する必要があります。

quadratic() : a(0), b(0), c(0)
{
}

quadratic(double A, double B, double C) : a(A), b(B), c(C)
{
}

上記は、C++ 言語の一部を使用して、初期化子リストと呼ばれるメンバー変数を初期化します。


パラメーターを使用してコンストラクターに対して行ったこと:

double A = double a;
double B = double b;
double C = double c;

まず第一にコンパイルされませんが、あなたがしたことを単純化したとしても:

double A = a;
double B = b;
double C = c;

A、B、および C が既に定義されているため、それでもコンパイルされません。上記のように型名の後に変数名を付けると、新しい変数を作成しようとします。

したがって、もう一度単純化すると、次のようになります。

A = a;
B = b;
C = c;

その後、これはまだ間違っていますが、少なくともコンパイルされます。パラメータを初期化されていないクラス変数の値に設定しているため、間違っています。

代わりに、次のようにします。

a = A;
b = B;
c = C;

パラメーターなしのコンストラクターに対して行ったこと:

 double A, double B, double C = 0.0;

これはコンパイルされません。1 行で多くの変数を宣言する正しい構文は次のとおりです。

 double A = 0, B = 0, C = 0;

しかし、これはまだ正しくありません。3 つの新しい変数 A、B、および C を作成し、それらを 0 に初期化するだけです。本当に必要なのは、メンバー変数 a、b、および c を設定することです。

あなたが望んでいるのは:

a = b = c = 0;

于 2010-09-10T11:57:45.657 に答える
4

これを行う直接的で簡単な方法は次のとおりです。

class quadratic {
 public:
  explicit quadratic(double A=0,double B=0,double C=0): a(A),b(B),c(C) { }
  double evaluate(const double x);
  void getCoefficients (double &A, double &B, double &C);
  void setCoefficients (const double A, const double B, const double C);

 private:
  double a;
  double b;
  double c;
};

パラメーターなしで 2 番目のコンストラクターを宣言し、すべての値を 0 に割り当てることもできますが、より多くのコードを使用します。私にとっては、コンストラクターの既定値が望ましいです。

これは、コンストラクターで 1 つまたは 2 つのパラメーターのみを使用することはもはや有効ではないという事実を除いて、同じ代替ソリューションです。

class quadratic {
 public:
  quadratic(double A,double B,double C): a(A),b(B),c(C) { }
  quadratic(): a(0), b(0), c(0) { }
  double evaluate(const double x);
  void getCoefficients (double &A, double &B, double &C);
  void setCoefficients (const double A, const double B, const double C);

 private:
  double a;
  double b;
  double c;
};
于 2010-09-10T12:01:20.870 に答える
2

メンバー初期化リストを使用します。

quadratic():
    a(0),b(0),c(0)
{}

quadratic(double a_,double b_,double c_):
    a(a_),b(b_),c(c_)
{}
于 2010-09-10T11:57:54.003 に答える
1

初期化リストを使用して、クラス メンバー変数を初期化します。あなたが書いたのは課題です。

また、OP のコードは、クラス メンバー変数ではなく、コンストラクター内で定義されたローカル変数に割り当てます。クラスのメンバー変数を初期化することが意図されていたと思います

quadratic() : a(0.0), b(0.0), c(0.0)
{
} 

quadratic(double A, double B, double C)  : a(A), b(B), c(C)
{ 
}
于 2010-09-10T11:57:24.427 に答える