인프런 커뮤니티 질문&답변

rsfnqf98님의 프로필 이미지
rsfnqf98

작성한 질문수

홍정모의 따라하며 배우는 C++

9.1 산술 연산자 오버로딩 하기

질문드립니다ㅠㅠ

작성

·

166

0

비전공자라 많이 서툰지라.. 열심히 배우기 위해서 질문드려봅니다!! ㅠㅠ

이번에 벡터의 성분 합을 직접 표현 해보고 싶어서, 교수님이 알려주신 다양한 방법들을 통하여 아래와 같은 코드를 짰습니다.

#include <iostream>
#include <cstdarg>

using namespace std;

class y_vector
{
private:
	int m_size;
	int *vector;

public:
	y_vector(const int& size)
		: m_size(size)
	{
		vector = new int[m_size];
	}

	~y_vector()
	{
		delete[] vector;
	}

	y_vector& set_array(int value, ...)
	{
		va_list list;
		va_start(list, value);
		for (int i = 0; i < m_size; i += 1)
		{
			if (i == 0) { vector[i] = value; continue; }
			else { vector[i] = va_arg(list, int); }
		}
		va_end(list);
		return *this;
	}

	void print_array()
	{
		for (int i = 0; i < m_size; i += 1)
		{
			cout << vector[i] << " ";
		}
		cout << endl;
	}

	bool is_same_size(const y_vector &v)
	{
		return v.m_size == this->m_size ? true : false;
	}

	y_vector& operator + (const y_vector& v)
	{
		y_vector dum(this->m_size);
		if (is_same_size(v))
		{
			for (int i = 0; i < this->m_size; i += 1)
			{
				dum.vector[i] = this->vector[i] + v.vector[i];
				cout << dum.vector[i] << endl; // 함수 내부에서는 잘되는 지 확인하려고 넣어둠
			}
		}
		else { cout << "Size is not Same" << endl; return *this; }
	}
};

int main()
{
	y_vector yh_1(5);
	y_vector yh_2(5);
	y_vector yh_3(6);
	yh_1.set_array(3, 2, 1, 4, 6);
	yh_2.set_array(1, 1, 3, 9, 12);
	yh_3.set_array(2, 8, 3, 4, 7, 5);

	y_vector yh_4 = yh_1 + yh_2;
	yh_4.print_array();

	return 0;
}

위에 보면 체이닝을 위하여

+ 산술자를 오버로드 한 함수와 벡터 성분을 결정지어주는 set_array 함수를 y_vector& 타입으로 받아주었습니다.

그러다 보니, + 산술자 함수의 리턴 값으로 어떠한 클래스를 설정해주기 위해 함수 내부적으로  임시적인 클래스의 인스턴스(dum)을

생성해 주었는데,

해당 영역에서 나가게 될 경우 소멸자에 의해 동적 할당 된 vector사라지다 보니,

yh_4.print_array();에서 쓰레기 값을 출력하고,

프로그램에서 런타임 에러가 계속 발생하게 됩니다..

입력 값으로 들어가게 된 인스턴스와 같이 연산이 되는

this에 해당하는 인스턴스의 값을 바꾸지 않고(const로 생각하여)

다른 클래스를 생성하여 반환하는게 가능 할까요..? 동적할당이다보니 불가능할것 같기도 하고,

제가 많이 알지 못하다 보니 할수없는 것을 잡고있는건지, 제가 못하는 건지도 모르겠어서 질문드립니다..   

답변 2

1

홍정모님의 프로필 이미지
홍정모
지식공유자

안녕하세요? 새로운 시도를 하시는 것이 좋아보이는데 강의의 범위를 벗어나는 내용까지 모두 알려드리기는 어렵다는 점이 저도 아쉽게 생각이 되네요.  c++에 수학 라이브러리가 여러가지가 있는데 그래픽스 관련 라이브러리에서는 glm을 많이 쓰고 그 외에는 Eigen을 많이 씁니다. 게임쪽을 좋아하신다면 언리얼이 코드를 공개하고 있으니 언리얼 코드를 보시는 것도 공부에 도움이 될 것 같습니다. 참고로 glm의 vector 구현된 부분 링크를 남겨드리니 참고하세요. 아마 생각하던 것 보다는 복잡하다고 느껴지실 텐데 조금 찬찬히 보시면 눈에 들어오기 시작할겁니다.

https://github.com/g-truc/glm/blob/master/glm/detail/type_vec2.inl

0

rsfnqf98님의 프로필 이미지
rsfnqf98
질문자

감사합니다. 찬찬히 잘 보도록 하겠습니다. 좋은하루 되십시오!!

rsfnqf98님의 프로필 이미지
rsfnqf98

작성한 질문수

질문하기