I'm fairly new to C++, so maybe I'm doing something wrong, but I cannot figure out what it is.
My assignment for a Data Structures class is to implement the following header file:
#ifndef __CS20A__Test__
#define __CS20A__Test__
#include <stdio.h>
namespace cs20a
{
class ThreeDPoint
{
public:
ThreeDPoint(int x, int y, int z);
double Distance() const;
friend bool operator ==(const ThreeDPoint &pt1, const ThreeDPoint &pt2);
friend bool operator !=(const ThreeDPoint &pt1, const ThreeDPoint &pt2);
friend ThreeDPoint operator +(const ThreeDPoint& pt1, const ThreeDPoint& pt2);
friend ThreeDPoint operator -(const ThreeDPoint& pt1, const ThreeDPoint& pt2);
//dot product
friend int operator *(const ThreeDPoint& pt1, const ThreeDPoint& pt2);
int getX() const;
int getY() const;
int getZ() const;
private:
int x;
int y;
int z;
};
}
#endif /* defined(__CS20A__Test__) */
Here's my implementation: #include "ThreeDPoint.h" #include #include
using namespace cs20a;
ThreeDPoint::ThreeDPoint(int x, int y, int z)
{
this->x = x;
this->y = y;
this->z = z;
}
double ThreeDPoint::Distance() const
{
return sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
}
bool operator== (ThreeDPoint &pt1, ThreeDPoint &pt2)
{
return ((pt1.getX() == pt2.getX()) && (pt1.getY() == pt2.getY()) && (pt1.getZ() == pt2.getZ()));
}
bool operator !=(const ThreeDPoint &pt1, const ThreeDPoint &pt2)
{
return !(pt1.getX() == pt2.getX() && pt1.getY() == pt2.getY() && pt1.getZ() == pt2.getZ());
}
ThreeDPoint operator +(const ThreeDPoint& pt1, const ThreeDPoint& pt2)
{
return ThreeDPoint(pt1.getX() + pt2.getX(), pt1.getY() + pt2.getY(), pt1.getZ() + pt2.getZ());
}
ThreeDPoint operator -(const ThreeDPoint& pt1, const ThreeDPoint& pt2)
{
return ThreeDPoint(pt1.getX() - pt2.getX(), pt1.getY() - pt2.getY(), pt1.getZ() - pt2.getZ());
}
int operator *(const ThreeDPoint& pt1, const ThreeDPoint& pt2)
{
return pt1.getX() * pt2.getX() + pt1.getY() * pt2.getY() + pt1.getZ() * pt2.getZ();
}
int ThreeDPoint::getX() const {
return x;
}
int ThreeDPoint::getY() const {
return y;
}
int ThreeDPoint::getZ() const {
return z;
}
These two files in themselves compile fine, but when I add a driver like
#include <iostream>
#include "ThreeDPoint.h"
int main(int argc, const char * argv[]) {
cs20a::ThreeDPoint pt1(1,2,3);
cs20a::ThreeDPoint pt2(1,2,3);
// insert code here...
std::cout << (pt1 == pt2);
return 0;
}
Or any driver with ThreeDPoint == ThreeDPoint or ThreeDPoint + ThreeDPoint, When I try to build it, I get this error:
Ld /Users/jaredjensen/Library/Developer/Xcode/DerivedData/CS20A-fztpdusrphrftebtzmkhjpjcduym/Build/Products/Debug/CS20A normal x86_64
cd "/Users/jaredjensen/Google Drive/XCode/CS20A"
export MACOSX_DEPLOYMENT_TARGET=10.9 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -L/Users/jaredjensen/Library/Developer/Xcode/DerivedData/CS20A-fztpdusrphrftebtzmkhjpjcduym/Build/Products/Debug -F/Users/jaredjensen/Library/Developer/Xcode/DerivedData/CS20A-fztpdusrphrftebtzmkhjpjcduym/Build/Products/Debug -filelist /Users/jaredjensen/Library/Developer/Xcode/DerivedData/CS20A-fztpdusrphrftebtzmkhjpjcduym/Build/Intermediates/CS20A.build/Debug/CS20A.build/Objects-normal/x86_64/CS20A.LinkFileList -mmacosx-version-min=10.9 -stdlib=libc++ -Xlinker -dependency_info -Xlinker /Users/jaredjensen/Library/Developer/Xcode/DerivedData/CS20A-fztpdusrphrftebtzmkhjpjcduym/Build/Intermediates/CS20A.build/Debug/CS20A.build/Objects-normal/x86_64/CS20A_dependency_info.dat -o /Users/jaredjensen/Library/Developer/Xcode/DerivedData/CS20A-fztpdusrphrftebtzmkhjpjcduym/Build/Products/Debug/CS20A
Undefined symbols for architecture x86_64:
"cs20a::operator==(cs20a::ThreeDPoint const&, cs20a::ThreeDPoint const&)", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I've tried everything and I can't fix this error. This only happens when I make the operators friend functions. If I make them members, and delete one of the parameters, it works fine. Is there something I'm doing wrong?