1

可能重复:
内部类可以访问私有变量吗?

因此,我尝试使用优先级队列,并且在此队列的上下文中,如果 D[i] < D[j],我想将整数 i 定义为“小于”另一个整数 j。我怎样才能做到这一点?(D是对象的数据成员)

到目前为止我有

/* This function gets the k nearest neighbors for a user in feature
 * space.  These neighbors are stored in a priority queue and then
 * transferred to the array N. */
void kNN::getNN() {
    int r;
    priority_queue<int, vector<int>, CompareDist> NN;

    /* Initialize priority queue */
    for (r = 0; r < k; r++) {
        NN.push(r);
    }

    /* Look at the furthest of the k users.  If current user is closer,
     * replace the furthest with the current user. */
    for (r = k; r < NUM_USERS; r++) {
        if (NN.top() > r) {
            NN.pop();
            NN.push(r);
        }
    }

    /* Transfer neighbors to an array. */
    for (r = 0; r < k; r++) {
        N[r] = NN.top();
        NN.pop();
    }
}

在 kNN.hh 中:

class kNN {

private:
    struct CompareDist {
        bool operator()(int u1, int u2) {
            if (D[u1] < D[u2])
                return true;
            else
                return false;
        }
    };
...

但是,这给了我错误

kNN.hh: In member function ‘bool kNN::CompareDist::operator()(int, int)’:
kNN.hh:29: error: invalid use of nonstatic data member ‘kNN::D’

我能做些什么呢?如果我在比较器中引用特定对象,似乎 C++ 不喜欢它,但我不知道如何在不引用 D 的情况下解决这个问题。

谢谢!

4

2 回答 2

4

您可以将对象的引用传递给D对象的构造函数CompareDist,然后Doperator().

在这个示例中,我存储了一个指向D. 根据 的类型D,您可能希望存储D. (如果D是原始数组,我的示例中的语法可以简化。)

struct CompareDist {
    const DType* pD;
    CompareDist(const DType& D) : pd(&D) {}
    bool operator()(int u1, int u2) {
        return (*pD)[u1] < (*pD)[u2];
    }
};

priority_queue<int, vector<int>, CompareDist> NN(CompareDist(D));
于 2012-11-28T03:36:23.147 回答
-1

好的,现在我已经更好地阅读了您的问题,我可以更新答案:问题是它D是一个包含在 实例中的对象kNN,因此它不是static也不能从静态上下文中访问。

您可以通过在类中使用对 D 的静态引用来解决问题,例如

// .h
class kNN {
  static Type* current;
  ..

    struct CompareDist {
      bool operator()(int u1, int u2) {
        if ((*current)[u1] < (*current)[u2])
          return true;
        else
          return false;
      }
    };
}

// .cpp
Type *kNN::current = NULL;

void kNN::method()
{
  kNN::current = D; // beforing using the comparator
  ..
}

此外,签名应通过 const 引用使用元素,例如

bool operator()(const int &u1, const int &u2)
于 2012-11-28T03:25:56.540 回答