n 몸체 문제를 모델링하는 데 사용하는 Point 구조체를 작성했습니다. 나는 완전히 이해하고 실현하기 어려웠다. 복사 & 스왑 이디엄을 주로 속도 인 나의 요구에 적응시켰다. 이 일을 제대로하고 있습니까? 그것은 C++ 17에서 달라질까요?포인트 구조체에 적용된 C++ 및 스왑/복사
#pragma once
#include <algorithm>
struct Point
{
double x, y, z;
explicit Point(double X = 0, double Y = 0, double Z = 0) : x(X), y(Y), z(Z) {}
void swap(Point&, Point&);
inline bool operator==(Point b) const { return (x == b.x && y == b.y && z == b.z); }
inline bool operator!=(Point b) const { return (x != b.x || y != b.y || z != b.z); }
Point& operator=(Point&);
Point& operator+(Point&) const;
Point& operator-(Point&) const;
inline double operator*(Point& b) const { return b.x*x + b.y*y + b.z*z; } // Dot product
Point& operator%(Point&) const; // % = Cross product
inline Point& operator+=(Point& b) { return *this = *this + b; }
inline Point& operator-=(Point& b) { return *this = *this - b; }
inline Point& operator%=(Point& b) { return *this = *this % b; }
Point& operator*(double) const;
Point& operator/(double) const;
inline Point& operator*=(double k) { return *this = *this * k; }
inline Point& operator/=(double k) { return *this = *this/k; }
};
std::ostream &operator<<(std::ostream &os, const Point& a) {
os << "(" << a.x << ", " << a.y << ", " << a.z << ")";
return os;
}
void Point::swap(Point& a, Point& b) {
std::swap(a.x, b.x);
std::swap(a.y, b.y);
std::swap(a.z, b.z);
}
Point& Point::operator=(Point& b) {
swap(*this, b);
return *this;
}
Point& Point::operator+(Point& b) const {
Point *p = new Point(x + b.x, y + b.y, z + b.z);
return *p;
}
Point& Point::operator-(Point& b) const {
Point *p = new Point(x - b.x, y - b.y, z - b.z);
return *p;
}
Point& Point::operator%(Point& b) const {
Point *p = new Point(
y*b.z - z*b.y,
z*b.x - x*b.z,
x*b.y - y*b.x
);
return *p;
}
Point& Point::operator*(double k) const {
Point *p = new Point(k*x, k*y, k*z);
return *p;
}
Point& Point::operator/(double k) const {
Point *p = new Point(x/k, y/k, z/k);
return *p;
}
) 코드가 누수 된 것처럼 보입니다. –
코드에서 모든 포인터와 모든 호출을'new'로 제거해야합니다. 또한 모든 일반 산술 연산자 (+, not + =)를 값으로 반환하도록 변경하십시오. –
'operator ='함수는 대입 연산자의 * 양쪽에있는 객체를 변경합니다. 또한 연산자의 오른쪽에있는 rvalues ("rvalue"의 "r"이 나타내는 것)와 함께 사용할 수 없습니다. 연산자는 스왑을 사용하는 경우 값 *으로, * 그렇지 않으면 * 상수 * 참조로 인수 *를 가져야합니다. –