0

ユーザーからの入力を必要とせずに、複素数の加算、減算などを表示することになっているコードがあります。test.cpp、complex.cpp、complex.hの3つのクラスがあり、それぞれプログラムを実行し、コンストラクターとメソッドを定義し、ヘッダークラ​​スを作成します。ただし、コードを実行すると、しばらくの間理解しようとしていた一連のエラーが発生します。

complex.h

//complex class definition
#ifndef COMPLEX_H
#define COMPLEX_H


//class complex
class Complex
{
public:
    Complex(); //default no arg constructor
    Complex(double a); //one arg constructor
    Complex(double a, double b); //two arg constructor
    Complex operator+(const Complex &) const; //addition method
    Complex operator-(const Complex &) const; //subtraction method
    Complex operator*(const Complex &) const; //multiplication method
    Complex operator/(const Complex &) const; //division method
    void print() const; //output
private:
    double a; //real number
    double b; //imaginary number
}; //end class Complex

#endif

complex.cpp

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

//no arg constructor
Complex::Complex()
{
    a = 0;
    b = 0;
}

//one arg instructor
Complex::Complex(double real)
{
    a = real;
    b = 0;
}

//two arg constructor
Complex::Complex(double real, double imaginary)
{
    a = real;
    b = imaginary;
}

//addition
Complex Complex::operator+(const Complex &number2) const
{
    return a + number2.a, b + number2.b;
}

//subtraction
Complex Complex::operator-(const Complex &number2) const
{
    return a - number2.a, b - number2.b;
}

//multiplication
Complex Complex::operator*(const Complex &number2) const
{
    return a * number2.a, b * number2.b;
}

//division
Complex Complex::operator/(const Complex &number2) const
{
    return a / number2.a, b / number2.b;
}

//output display for complex number
void Complex::print() const
{
    cout << '(' << a << ", " << b << ')';
}

test.cpp

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

int main()
{
    Complex b(1.0, 0.0);
    Complex c(3.0, -1.0);

    /*cout << "a: ";
    a.print();

    system ("PAUSE");*/

};

現在のテストでは、コードが示すように、下部がコメント化されており、3つのコンストラクターのうち2つだけを呼び出して、これが機能するかどうかを確認しようとしました。

私が受け取るエラー:

    error C2065: 'Complex' : undeclared identifier
    error C2065: 'Complex' : undeclared identifier
    error C2146: syntax error : missing ';' before identifier 'b'
    error C2146: syntax error : missing ';' before identifier 'c'
    error C3861: 'b': identifier not found  
    error C3861: 'c': identifier not found

Visual Studio 2010でこれを実行しようとしています。誰か助けてもらえますか?

4

4 に答える 4

3

問題はComplex.cppにあると思います。クラスのコードのコンパイル中にエラーが発生した場合、クラスは不明であるため、識別子Complexも不明です。

クイックビューの後、すべてが正しいように見えますが、演算子関数にいくつかのエラーがあります。

正しくない:

    //addition
    Complex Complex::operator+(const Complex &number2) const
    {
        return a + number2.a, b + number2.b;
    }

正しい:

    //addition
    Complex Complex::operator+(const Complex &number2) const
    {          
        return Complex(a + number2.a, b + number2.b);
    }

問題は、演算子メソッドの戻り型です。それらは宣言されたものと同じでなければなりません。また、2つの変数を同時に返すことはできません。これを行う場合は、構造体またはクラスを使用する必要があります(新しい値を使用してクラスComplexのコンストラクターを呼び出すことにより)。

メンバーaとbを操作する場合、メソッドを「const」として定義することはできません。関数がconstであると言う場合、このメソッドを呼び出してもすべてのクラスメンバーの値が操作されないことを意味します。

于 2012-11-13T10:19:44.327 に答える
1
#include <complex>
#include "complex.h"

それは悪臭です。これらの #include ファイルの両方がヘッダー ガードに同じ名前を使用している可能性があります。

このように変更してみてください。

#ifndef MY_COMPLEX_H
#define MY_COMPLEX_H

..そして、同じ名前のシステムヘッダーファイルとの衝突を避けるために、モジュールの名前を「complex」から別の名前に変更してください。

于 2012-11-13T10:35:58.590 に答える
1

stdafx.h の問題に直面している可能性があります

少なくとも#include "stdafx.h、他のすべてのインクルードの前に置くことを試みる必要があります。または、stdafx.h を使用しないようにプロジェクト プロパティを設定することもできます。

1. right click on project and select Properties
2. go to C/C++ -> Precompiled Headers 
3. select "Not Using Precompiled Headers"
于 2012-11-13T09:07:53.727 に答える
0

できるだけシンプルにしてみてください。次に、エラーが見つかるまでパーツを追加します。

これは機能しますか?

#include "complex.h"

int main()
{
    Complex c(3.0, -1.0);

    return 0;
};
于 2012-11-13T09:45:09.440 に答える