Why the console hangs and doesn't quit?

There is a code
#include<conio.h>
#include<math.h>
#include<iostream.h>

class Complex
{
private:
 int A, B;
public:
 Complex(int, int);
 Complex() {};

 int GetA();
 int GetB();

 void PutA(int);
 void PutB(int);

 void PrintComplex();

 void MultComplex(Complex, Complex&); // 1
 void pMultComplexV(Complex, Complex*); // 2
 Complex* pMultComplex(Complex); // 3
 void MltComplexP(Complex*, Complex&); // 7
 void pMltComplexP(Complex*, Complex*); // 8
 Complex* pMltComplex(Complex*); // 9
 Complex MultComplex(Complex); // 12
 Complex operator*(Complex); // 13

 friend void MultComplex(Complex, Complex, Complex&); // 14
 friend void MultComplex2(Complex, Complex, Complex*); // 15
};

void MultV(Complex, Complex, Complex&); // 4
Complex* pMultVct(Complex, Complex); // 5
void MultVec(Complex, Complex, Complex*); // 6
void MltVct(Complex*, Complex*, Complex&); // 10
Complex* pMltVct(Complex*, Complex*); // 11

Complex::Complex(int A, int B): A(A) B(B) {}

int Complex::GetA() {return A;}
int Complex::GetB() {return B;}

void Complex::PutA(int A) {this->A=A;}
void Complex::PutB(int B) {this->B=B;}

void Complex::PrintComplex() {cout<<"A = "<<A<<" B = "<<B<<endl;};

void Complex::MultComplex(Complex Z2, Complex& CR) // 1
{
 CR.A = A*Z2.A - B*Z2.B;
 CR.B = A*Z2.B + B*Z2.A;
}
void Complex::pMultComplexV(Complex Z2, Complex* pC) // 2
{
 pC->A = A*Z2.A - B*Z2.B;
 pC->B = A*Z2.B + B*Z2.A;
}
Complex* Complex::pMultComplex(Complex Z2) // 3
{
 Complex* pC;
 pC->A = A*Z2.A - B*Z2.B;
 pC->B = A*Z2.B + B*Z2.A;
 return pC;
}
void MultV(Complex Z1, Complex Z2, Complex &C) // 4
{
 C. PutA( Z1.GetA() * Z2.GetA() - Z1.GetB() * Z2.GetB() );
 C. PutB( Z1.GetA() * Z2.GetB() + Z1.GetB() * Z2.GetA() ); // 1 2 2 1
}
Complex* pMultVct(Complex Z1, Complex Z2) // 5
{
 Complex *pC;
 pC->PutA( Z1.GetA() * Z2.GetA() - Z1.GetB() * Z2.GetB());
 pC->PutB( Z1.GetA() * Z2.GetB() + Z1.GetB() * Z2.GetA());
 return pC;
}
void MultVec(Complex Z1, Complex Z2, Complex *pC) // 6
{
 pC->PutA( Z1.GetA() * Z2.GetA() - Z1.GetB() * Z2.GetB());
 pC->PutB( Z1.GetA() * Z2.GetB() + Z1.GetB() * Z2.GetA());
}
void Complex::MltComplexP(Complex* pZ2, Complex &C) // 7
{
 C. PutA( A * pZ2->GetA() - B * pZ2->GetB());
 C. PutB( A * pZ2->GetB() + B * pZ2->GetA());
}
void Complex::pMltComplexP(Complex* pZ2, Complex* pC) // 8
{
 pC->PutA( A * pZ2->GetA() - B * pZ2->GetB());
 pC->PutB( A * pZ2->GetB() + B * pZ2->GetA());
}
Complex* Complex::pMltComplex(Complex* pZ2) // 9
{
 Complex* pR;
 pR>PutA( A * pZ2->GetA() - B * pZ2->GetB());
 pR->PutB( A * pZ2->GetB() + B * pZ2->GetA());
 return pR;
}
void MltVct(Complex* pZ1, Complex* pZ2, Complex& CR) // 10
{
 CR.PutA( pZ1->GetA() * pZ2->GetA() - pZ2->GetB() * pZ2->GetB());
 CR.PutB( pZ1->GetA() * pZ2->GetB() + pZ2->GetB() * pZ2->GetA());
}
Complex* pMltVct(Complex* pZ1, Complex* pZ2) // 11
{
 Complex* pV;
 pV->PutA( pZ1->GetA() * pZ2->GetA() - pZ2->GetB() * pZ2->GetB());
 pV->PutB( pZ1->GetA() * pZ2->GetB() + pZ2->GetB() * pZ2->GetA());
 return pV;
}
Complex Complex::MultComplex(Complex Z2) // 12
{
 Complex R;
 R. A = A * Z2.A - B * Z2.B;
 R. B = A * Z2.B + B * Z2.A;
 return R;
}
Complex Complex::operator* (Complex Z2) // 13
{
 Complex R;
 R. A = A * Z2.A - B * Z2.B;
 R. B = A * Z2.B + B * Z2.A;
 return R;
}
void MultComplex(Complex Z1, Complex Z2, Complex &C) // 14
{
 C. A = Z1.A * Z2.A - Z1.B * Z2.B;
 C. B = Z1.A * Z2.B + Z1.B * Z2.A;
}
void MultComplex2(Complex Z1, Complex Z2, Complex *pC) // 15
{
 pC->A = Z1.A * Z2.A - Z1.B * Z2.B;
 pC->B = Z1.A * Z2.B + Z1.B * Z2.A;
}
void main()
{
clrscr();

 Complex 
 Z1(1,2), Z2(1,2),
 C1, C4, C7, C8, C10, C12, C13, C14, C15,
 *pC2, *pC3, *pC5, *pC6, *pC8, *pC9, *pC11;

 cout<<"Z1: "; Z1. PrintComplex(); getch();
 cout<<"Z2: "; Z2. PrintComplex(); getch();

 // Z1.MultComplex(Z2, C1); // 1
 // cout<<"C1: ";
 // C1.PrintComplex(); getch();

 // Z1.pMultComplexV(Z2, pC2); // 2
 // cout<<"C2: ";
 // pC2->PrintComplex(); getch();

 pC3 = Z1.pMultComplex(Z2); // 3
 cout<<"C3: ";
 pC3->PrintComplex(); getch();

 // MultV(Z1, Z2, C4); // 4
 // cout<<"C4: "; 
 // C4.PrintComplex(); getch();

 // pC5 = pMultVct(Z1, Z2); // 5
 // cout<<"C5: ";
 // pC5->PrintComplex(); getch();

 // MultVec(Z1, Z2, pC6); // 6
 // cout<<"C6: ";
 // pC6->PrintComplex(); getch();

 // Z1.MltComplexP(&Z2, C7); // 7
 // cout<<"C7: ";
 // C7.PrintComplex(); getch();

 // Z1.pMltComplexP(&Z2, pC8); // 8
 // cout<<"C8: ";
 // pC8->PrintComplex(); getch();

 // Z1.pMltComplexP(&Z2, &C8); // 8
 // cout<<"C8: ";
 // C8.PrintComplex(); getch();

 // pC9 = Z1.pMltComplex(&Z2); // 9
 // cout<<"C9: ";
 // pC9->PrintComplex(); getch();

 // MltVct(&Z1, &Z2, C10); // 10
 // cout<<"C10: ";
 // C10.PrintComplex(); getch();

 // pC11 = pMltVct(&Z1, &Z2); // 11
 // cout<<"C11: ";
 // pC11->PrintComplex(); getch();

 // C12 = Z1.MultComplex(Z2); // 12
 // cout<<"C12: ";
 // C12.PrintComplex(); getch();
 // cout<<"C12: ";
 // Z1.MultComplex(Z2).PrintComplex();
 // getch();

 // C13 = Z1*Z2; // 13
 // cout<<"C13: ";
 // C13.PrintComplex(); getch();

 // MultComplex(Z1, Z2, C14); // 14
 // cout<<"C14: ";
 // C14.PrintComplex(); getch();

 // MultComplex2(Z1, Z2, &C15); // 15
 // cout<<"C15: ";
 // C15.PrintComplex(); getch();
}


Found out that this function pMultComplex, I don't understand what it involves.
March 23rd 20 at 18:56
1 answer
March 23rd 20 at 18:58
Solution
When you declare a pointer to an object, it does not mean that you have an object, you only have a pointer (in your case it is still not initialized, i.e. objects do not).
A pointer to anything - it's just an address in memory (i.e. it's just an integer).
And you pMultComplex still appeal to an uninitialized pointer.
Similarly, in some other functions.

Why do you need so many variations of multiplication? It's some kind of perversion.
Enough operator* and operator*=.
You can still simplify is to make * using *=.

Override operations with pointers makes no sense - use the links.
This is the lab, where all the methods are transmission objects, etc.
There are manuals, there is realized such a method, one to one like mine, but there does not hang, and I hang, the only difference is that there is still a line over the variable Z
The program works correctly, regarding the job, but in the end, as an infinite loop hangs. - Forest_Veum60 commented on March 23rd 20 at 19:01
@Forest_Veum60, the Cause of the unresponsiveness I have written. Though it is strange that it hangs, usually in such cases, "access violation" in Windows or a segmentation fault in nikah.
The rest of my post can be ignored.
The correct version of the method pMultComplex:
Complex* Complex::pMultComplex(Complex Z2) // 3
{
 Complex* pC = new Complex();
 pC->A = A*Z2.A - B*Z2.B;
 pC->B = A*Z2.B + B*Z2.A;
 return pC;
}
- diamon commented on March 23rd 20 at 19:04
@Forest_Veum60, And don't forget to delete allocated memory: each new must be a call to delete! - diamon commented on March 23rd 20 at 19:07
@diamon, thanks - Forest_Veum60 commented on March 23rd 20 at 19:10

Find more questions by tags C++