質問

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.

役に立ちましたか?

解決

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.

他のヒント

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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top