Question

I have try to fix the function returning empty vector. I have did some google search, it shows i need a copy constructor for the class Point, and i keep receiving this error:

Undefined symbols for architecture x86_64:   "Point::Point(Point const&)", referenced from:
      Core::render() in Week3_T.o
      Core::sortTriVertices(Point&, Point&, Point&) in Week3_T.o
      Core::decompose(std::__1::vector<Point, std::__1::allocator<Point> >) in Week3_T.o
      Core::drawTriangle(Point, Point, Point) in Week3_T.o
      Core::clipedge(std::__1::vector<Point, std::__1::allocator<Point> >, int, int, int, int) in Week3_T.o
      std::__1::enable_if<__is_forward_iterator<Point*>::value, void>::type std::__1::vector<Point, std::__1::allocator<Point>
>::__construct_at_end<Point*>(Point*, Point*) in Week3_T.o
      void std::__1::vector<Point, std::__1::allocator<Point> >::__push_back_slow_path<Point const>(Point const&) in Week3_T.o
      ... ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

and my class :

class Point
{
public:
    int x;
    int y;
    Uint8 r;
    Uint8 g;
    Uint8 b;
    Point(int x, int y, Uint8 r, Uint8 g, Uint8 b) : x(x), y(y), r(r), g(g), b(b) {}
    Point& operator=(Point const &np){
        x=np.x;
        y=np.y;
        r=np.r;
        g=np.g;
        b=np.b;
        return *this;
    }
    Point(const Point& );
    Point(){}


};

and snippet of code:

std::vector<Point> Core::clipedge(vector<Point> polygon, int x0, int y0, int x1, int y1)
{

    int r=rand()%255;
    int g=rand()%255;
    int b=rand()%255;
    // For each side of the polygon, check the 4 cases of sutherland-hodgman.
    // Creating a temporary buffer to hold your new set of vertices for the clipped polygon.
    std::vector<Point> temp;
    temp.push_back(Point(1,2,255,255,255));
    int size = (int)polygon.size();

    for (int i = 0; i < size; ++i) {
       {....}
       //push_back clipped point
       temp.push_back(p1);
       {....}
    }
    return temp;

system is OSX10.9.2 and ide is xcode5.1.1 compiler is apple llvm5.1

What i need to do to fix this? thanks for help.

Was it helpful?

Solution

As has been pointed out in other answers, you have not provided the definition of Point::Point(const Point&), but you have declared it in your Point class definition. But your class requires no special handling of copy and assignment, so the solution to your problem is not to provide the missing definitions, but to remove the declaration of the copy constructor. Remove the assignment operator too:

class Point
{
public:
    int x;
    int y;
    Uint8 r;
    Uint8 g;
    Uint8 b;
    Point(int x, int y, Uint8 r, Uint8 g, Uint8 b) 
    : x(x), y(y), r(r), g(g), b(b) {}
};

The compiler-synthesized versions will do the right thing.

OTHER TIPS

It is likely that you didn't define Point(const Point& ); in your *.C file.... It compiles, because you've declared in the *.h file, but fails when trying to link because the symbol that other parts of the code refers to, cannot be found among the object files or libraries.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top