-1

私はあまり C++ に手を出すことはありませんが、データ構造について学んでおり、この本では言語として C++ が使用されています。現在、クラス編成を検討中です。

私の問題は次のとおりです。

  1. Visual Studio 2012 は、未確認の変数について吠えています。ヘッダーで宣言された変数があるため、なぜ問題が発生するのかよくわかりません。

  2. 加算演算子と乗算演算子を (非メンバー関数として) オーバーロードしようとしていますが、オーバーロードのパラメーターを 1 つしか持てないかのように使用しようとしています。

ここに私がやっていることのコードがあります:

1. 未知の変数

/* Quadratic.h */

#include <iostream>
using namespace std;

class Quadratic 
{
 public: 
     // constructors
     Quadratic::Quadratic()

     // accessors
     Quadratic::getA();
     Quadratic::getB();
     Quadratic::getC();

     // mutators
     Quadratic::setCoefficients(float coA, float coB, float coC);

private:
    float a, b, c, x;

};

二次.cpp:

/* Quadratic.cpp */

#include <iostream>
#include "Quadratic.h"
using namespace std;

class Quadratic 
{

 // Default constructor
 Quadratic::Quadratic() 
 {
     a = 0;    // Visual Studio is complaining about a, b, & c
     b = 0; 
     c = 0;
 }

 /* Mutators */
 void Quadratic::setCoefficients(float coA, float coB, float coC) 
 {
     a = coA;
     b = coB;
     c = coC;
 }

 /* Accessors */
 float Quadratic::getA() const {
     return a;
 }

 float Quadratic::getB() const {
     return b;
 }

 float Quadratic::getC() const {
     return c;
 }

};

それが最初の問題です。これらの変数が見つからない理由はよくわかりません。誰かが私が間違っていることを指摘できますか?

2. 演算子のオーバーロード (パラメーターの不一致)

/* Quadratic.h */

/* Overloading Operators */
Quadratic & operator+(const Quadratic & q1, const Quadratic & q2);
Quadratic & operator*(double r, const Quadratic & q);

パラメータが多すぎると言っているだけです。q1.operater+(q2)次のようなことができるようになりたいので、どこで何かをすることを期待していると思いますq3 = q1 + q2

これらの小さな問題を修正するには、任意のポインターが最適です。

編集

要求されたコンパイラ エラー:

error C2804: binary 'operator +' has too many parameters
error C2804: binary 'operator *' has too many parameters

基本的には上で述べたことですが、おそらく私はそれについて明確ではありませんでした.

編集 2

なぜそれが反対票を投じられたのかはわかりませんが、反対票を投じる場合は、少なくともその理由を述べてください.質問が初心者だったからですか?質問の言い回しや説明が不十分だったからですか、それともあなたのエゴが高すぎるからですか? 新しいことを学ぼうとしている人をけなす必要はありません。

それ以外は、legend2kjohnstevesaldabasileの皆さん、時間を割いて私を助けてくれてありがとう。本当に感謝しています。C++ は、Java よりもはるかに実践的です。

4

4 に答える 4

2

John が提案しoperator+たように、関数とoperator*関数をクラスの外に移動します。ただし、オブジェクトのプライベート変数にアクセスする必要があるため、これらの関数をクラスのフレンドにする必要があります。

さらに、参照を返すものとして演算子関数を宣言しましたが、必要な構文についてはq3 = q1 + q2;、新しいオブジェクトを構築した後に値で返す必要があります。したがって、現在の関数operator+operator*関数を削除した後、次のことを行う必要があります

class Quadratic
{
    . . .
    friend Quadratic operator+ (const Quadratic &lhs, const Quadratic &rhs);
    friend Quadratic operator+ (double scalar, const Quadratic &rhs);
}

Quadratic operator+ (const Quadratic &lhs, const Quadratic &rhs)
{
    Quadratic result;
    result.setCoefficients(lhs.a + rhs.a, lhs.b + rhs.b, lhs.c + rhs.c);
    return result;
}

このようにコンストラクタを作成した場合

Quadratic::Quadratic(float coA = 0.f, float coB = 0.f, float coC = 0.f) :
    a(coA),
    b(coB),
    c(coC),
    x()
{
}

つまり、デフォルトの引数を使用すると、演算子関数を 1 行で記述できます。

Quadratic operator+ (const Quadratic &lhs, const Quadratic &rhs)
{
    return Quadratic(lhs.a + rhs.a, lhs.b + rhs.b, lhs.c + rhs.c);
}

これにより、コピーを回避する戻り値の最適化 (RVO)が容易になります。また、初期化リストを使用するコンストラクターでは、メンバーの割り当てよりも優れています。

于 2013-10-12T20:06:17.917 に答える
2

クラス全体を再宣言しているようです。C++ では、クラスを 1 回言ってインターフェイスを宣言し (通常は h ファイルで)、次にメソッドを定義します (通常は cpp ファイルで)。2 つのファイルで言うとclass、実装を定義するのではなく、クラスを再宣言しています。

Quadratic::また、クラス宣言内で宣言する必要はありません。これは、classキーワードによって、その内部で宣言するものはすべて、定義によりクラス スコープ内にあるためです。対照的に、実装を記述するときはQuadratic::、クラス スコープ内にないため、先頭に追加する必要があります。

namespace std最後に、 2 回「使用」する必要もありません。クラス宣言の前に h ファイルに入れるだけで十分です。cpp ファイルには h ファイルが含まれているため、cpp ファイルのクラス実装からもアクセスできます。

于 2013-10-12T19:54:06.093 に答える
1

通常の方法は、本体の前にコンストラクターでメンバー変数 (つまり、フィールド) を初期化することです。

Quadratic::Quadratic() : a(0), b(0), c(0), x(0) {};

次に、コンパイラーがフィールドを初期化済みと見なすと思います。(少なくともGCCはそうです)。

また、クラスでいくつかの演算子を宣言できます。ここを参照してください。

class Quadratic {
  Quadratic & operator += (const Quadratic&right);

クラスの外で宣言することもできます。

  Quadratic operator + (const Quadratic& left, const Quadratic& right);

他の人が言ったように、おそらく参照ではなく値を返したいでしょう。

が左オペランドであることに注意し*thisてください。通常はこれを返す必要があります。

ところで、表示された正確なエラー メッセージとその正確な場所を示してください。

于 2013-10-12T19:34:40.490 に答える