简体   繁体   中英

Nested class: how to access the member variable in enclosed class

The following code snippet aims to store all points in the member function mainFunc of enclosing class Solution in a priority_queue (ie pq ), such that all points are in the order according to their distance to origin . However, the compiler reports an error:

error: invalid use of non-static data member 'Solution::ori'

Then I change the 3rd line of Point ori to static Point ori and change ori to Solution::ori in the function of distance(Point p) , the link error occurs:

undefined reference to 'Solution::ori'

Could anyone help me on this? Thanks in advance!

/**
 * Definition for a point.
 * struct Point {
 *     int x;
 *     int y;
 *     Point() : x(0), y(0) {}
 *     Point(int a, int b) : x(a), y(b) {}
 * };
 */

class Solution {
private:
    Point ori;
    class Comparator {
    public:
        // calculate the euclidean distance between p and ori
        int distance(Point p) {
            return pow(p.x-ori.x, 2) + pow(p.y-ori.y, 2);
        }
        // overload the comparator (), the nearest point to 
        // origin comes to the first
        bool operator() (Point l, Point r) {
            if (distance(l) > distance(r)) {
                return true;
            }
        }        
    };

public:
    /*
     * @param points: a list of points
     * @param origin: a point
     */
    void mainFunc(vector<Point> points, Point origin) {
        ori = origin;
        priority_queue<Point, vector<Point>, Comparator> pq;
        for (int i = 0; i < points.size(); i++) {
            pq.push(points[i]);
        }
    }
};

You can modify your Comparator declaration to take a certain Point value in it's constructor:

class Solution {
private:
    Point ori;
    class Comparator {
    public:
        // Save the value in the functor class
        Comparator(const Point& origin) : origin_(origin) {}

        // calculate the euclidean distance between p and origin
        int distance(Point p) {
            return pow(p.x-origin_.x, 2) + pow(p.y-origin_.y, 2);
        }
        // overload the comparator (), the nearest point to 
        // origin comes to the first
        bool operator() (Point l, Point r) {
            if (distance(l) > distance(r)) {
                return true;
            }
        }        
    private:
         Point origin_;
    };

public:
    /*
     * @param points: a list of points
     * @param origin: a point
     */
    void mainFunc(vector<Point> points, Point origin) {
        ori = origin;
        priority_queue<Point, vector<Point>> pq(Comparator(ori));
                                             // ^^^^^^^^^^^^^^^ 
                                             // Pass an instance of 
                                             // the functor class
        for (int i = 0; i < points.size(); i++) {
            pq.push(points[i]);
        }
    }
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM