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 に答える