2016-04-16 8 views
0

私は問題を抱えていますが、コードをより効率的にしようとしています。私はVectorクラスを作成し、それを使っていくつかの基本的な計算を行う必要があります。ベクターライブラリーを使用することは問題外ですが、私は自分自身を作成する必要があります。 私が現在持っている問題は、数学の最終段階です。最初のベクトルと2番目のベクトルの値を入力できますが、それらを足し合わせると完全に乱数が得られます。私は私のヘッダーファイルと私のcppファイルを掲示しています - どんな助けもありがとう!いくつかの関数にまたがってクラスポインタにアクセスする

Vectors.h

#include <math.h> 
#include <iostream> 

class Vectors 
{ 
public: 
    Vectors(void); 
    ~Vectors(void); 
    Vectors(double a1, double b1, double c1, double d1) 
    { 
     a = a1; 
     b = b1; 
     c = c1; 
     d = d1; 
    } 
    void VectorAdd(Vectors vector1, Vectors vector2); 
    void VectorSub(); 
    void VectorMulti(); 
    void VectorDiv(); 
    void VectorDP(); 
    void VectorCP(); 
    void setV1(Vectors &vector1); 
    void setV2(Vectors &vector2); 
private: 
    double a; 
    double b; 
    double c; 
    double d; 
    double cp; 
}; 

CPPは

void Vectors::setV1(Vectors &vector1) 
{ 
    Vectors *Vector1 = new Vectors(); 
    std::cout << "Enter the values of the first vector please.\n"; 
    std::cout << "a1: "; 
    std::cin >> Vector1 -> a; 
    std::cout << "b1: "; 
    std::cin >> Vector1 -> b; 
    std::cout << "c1: "; 
    std::cin >> Vector1 -> c; 
    std::cout << "d1: "; 
    std::cin >> Vector1 -> d; 
    Vector1 = &vector1; 
    std::cin.get(); 
    std::cin.get(); 
} 

void Vectors::setV2(Vectors &vector2) 
{ 
    Vectors *Vector2 = new Vectors(); 
    std::cout << "Enter the values of the first vector please.\n"; 
    std::cout << "a1: "; 
    std::cin >> Vector2 -> a; 
    std::cout << "b1: "; 
    std::cin >> Vector2 -> b; 
    std::cout << "c1: "; 
    std::cin >> Vector2 -> c; 
    std::cout << "d1: "; 
    std::cin >> Vector2 -> d; 
    Vector2 = &vector2; 
    std::cin.get(); 
    std::cin.get(); 
} 

void Vectors::VectorAdd(Vectors vector1, Vectors vector2) 
{ 

    setV1(vector1); 
    setV2(vector2); 

    Vectors *Vector3 = new Vectors(); 
    std::cout << "Here is the combination of the two vectors.\n"; 
    Vector3 -> a = vector1.a + vector2.a; 
    std::cout << "a3: " << Vector3 -> a; 
    Vector3 -> b = vector1.b + vector2.b; 
    std::cout << "\nb3: " << Vector3 -> b; 
    Vector3 -> c = vector1.c + vector2.c; 
    std::cout << "\nc3: " << Vector3 -> c; 
    Vector3 -> d = vector1.d + vector2.d; 
    std::cout << "\nd3: " << Vector3 -> d; 
    std::cin.get(); 
    std::cin.get(); 
} 

を提出事前にありがとうございます!

答えて

1
Vector2 = &vector2; 

これは逆でした。初期化したばかりのオブジェクトにポインタを上書きすると、完全に初期化されていないオブジェクトへのポインタが渡されます。無作為のデータは、もちろん、初期化されていないオブジェクトにあります。

あなたは最初の場所で

Vectors *Vector2 = new Vectors(); 

を必要としません。ただvector2パラメータをstd::cinから直接初期化してください。その他の関数のsetV1()も同様です。同じこと。

+0

ありがとう!私はいつもすべてのポインタを理解することに問題を抱えていました。本当にそれらを見直す必要があります。 – Turkeydipking

0

ここでの問題は、ポインタ&の参照と混乱していると思います。

void Vectors::setV1(Vectors &vector1)には、vector1が参考になります。 次に、新しいオブジェクトVectors *Vector1 = new Vectors();を作成しています。そして、あなたは*Vector1を続けています。この点まで、私は奇妙なものは見ません。ただし、この部分Vector1 = &vector1;はプログラムに完全に損害を与えます。 Vector1vector1のポインターを再割り当てしています。

vector1で指摘されている値をメモリに持たない限り、正しい結果は得られません。実際には、あなたのプログラムはSIGSEGVを生成したと言っていないので、あなたはラッキーです:)