Fixing C++ Class Function for Complex Numbers

  • Context: Comp Sci 
  • Thread starter Thread starter jersiq1
  • Start date Start date
  • Tags Tags
    C++ Class Function
Click For Summary
SUMMARY

The discussion centers on a C++ class implementation for handling complex numbers, specifically the issue with the add method not returning the expected results. The original implementation returns a local object, leading to undefined behavior due to it going out of scope. The recommended solution is to either return a pointer to a dynamically allocated Complex object or modify the method to accept an output parameter for the result. This ensures that the data persists beyond the method's scope.

PREREQUISITES
  • Understanding of C++ class structures and member functions
  • Knowledge of object lifetime and scope in C++
  • Familiarity with dynamic memory allocation using new and delete
  • Basic concepts of complex numbers and arithmetic operations
NEXT STEPS
  • Learn about C++ memory management and the use of smart pointers
  • Explore the Factory design pattern in C++ for object creation
  • Study C++ operator overloading for complex number arithmetic
  • Investigate best practices for passing parameters in C++ functions
USEFUL FOR

C++ developers, computer science students, and anyone interested in object-oriented programming and complex number manipulation.

jersiq1
Messages
7
Reaction score
0
For one of my assignments, I have to write a program to add or subtract complex numbers. I wrote a class, and the problem I am having is that one of my methods isn't returning the data to the calling object. I am going to omit the things in my code that I don't think are pertinent.

Code:
int main()
{
	Complex num1(2,5),num2(7,8),num3,num4; 

	num3.add(num1,num2); //this is the function that isn't working as expected
	num3.print(); //I am not getting the proper output here. Just the values of the default constructor
	
cin.get();
	return 0;
}

Here's the Class:

Code:
class Complex 
{
public:
		Complex();
		Complex(int , int );
		~Complex();
		Complex add(Complex &,Complex &);
		Complex sub(Complex &,Complex &);
		void print();

private: //data accessed by public functions
	int real;
	int imaginary;
};

Complex Complex::add(Complex & c1, Complex & c2) 
{
	Complex added_numbers;
	added_numbers.real = c2.real+ c1.real;
	added_numbers.imaginary = c2.imaginary + c1.imaginary;
	added_numbers.print(); //I added this to make sure the addition was occurring
	return added_numbers;	
}
}

I added the print function within the add function just to make sure it was adding, and it is. However, it isn't returning the values of added_numbers. I guess I am just really failing to understand why.
 
Physics news on Phys.org
add() doesn't set the member values real and parts. it returns a new complex number object.

It would normally be a static function that you could call to create a complex object - a factory in pattern speak
 
The problem is here:
jersiq1 said:
Code:
Complex Complex::add(Complex & c1, Complex & c2) 
{
	Complex added_numbers;
	...
	return added_numbers;	
}
}

You are returning something that is going out of scope. In C/C++ parlance, this is "undefined behavior". Your program could make nasal demons fly out of the computer in response to this, but as far as the standards committee is concerned, the compiler would still be compliant. What you need to do is to create a new Complex number and return that.

Code:
Complex * Complex::add(Complex & c1, Complex & c2) 
	Complex * added_numbers = new Complex;
	...
	return added_numbers;	
}

Alternately, pass the number that will contain the result as an argument.
 

Similar threads

  • · Replies 15 ·
Replies
15
Views
2K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 15 ·
Replies
15
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 47 ·
2
Replies
47
Views
8K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 1 ·
Replies
1
Views
1K
  • · Replies 5 ·
Replies
5
Views
3K