0

次のコードでは、次のステートメントを検討してください:-"int B :: * bpm;"

class B
{
    public :
        int bi;
};
class D : public B
{

};
int main()
{
    D obj;

    int B::*bpm;
    bpm = &B::bi;

    obj.*bpm = 1;
    return 0;
}

*デザイン/コーディングの練習を改善するために、デザイン/コードで「メンバーへのポインタ」を使用する場合。****

4

7 に答える 7

3

STLの例が役立つ場合があります。

于 2010-09-03T09:37:32.827 に答える
1

メンバーへのポインタは、煩わしいリストに役立ちます

template<typename N, N *N::*nextp>
class LinkedList {
public:
  LinkedList()
    :head(0)
  { }

  void add(N *item) {
    item->*nextp = head;
    head = item;
  }

  N *gethead() { return head; }

private:
  N *head;
};

struct Node {
  int data;
  Node *next;
};

int main() {
  LinkedList<Node, &Node::next> n;
  Node a1 = { 1 };
  Node a2 = { 2 };
  n.add(&a2);
  n.add(&a1);
  // ...
}
于 2010-09-04T11:48:29.010 に答える
1

デザイン/コーディングの実践について言えば、私にとっては、「メンバーへのポインター」を使用して、とにかく公開されており、より明白な方法でアクセスできるメンバーにアクセスするのは良いデザインではありません。

于 2010-09-03T08:55:11.663 に答える
1

Stroustrup の例をチェックすれば、メンバ型へのポインタの威力を理解できると思います。

class Interface {
    public:
         virtual start() = 0;
         virtual stop() = 0;
         virtual pause() = 0;
         virtual resume() = 0;

         virtual ~Interface() { }
}

typedef void (Interface::*P_MEM) (); // pointer to member type

map<string, Interface*> variable;
map<string, P_MEM>      operation;

void call_member( string var, string oper )
{
    (variable[var]->*operation[oper])();  // var.oper()
}

これにより、関数または変数の動的アクセスが可能になります。

  • クラスのファクトリで動作を設定するために使用することもできます。

特定のアルゴリズムの動作を他にどのように設定しますか (アレクサンドルの例を参照)。

  • 動作クラスを作成することはできますが、関数ごとに 1 つのクラスを作成し、すべてのクラスに対してさらに別のインターフェイスを作成して、アルゴリズムがそれを呼び出すようにする必要があります。クラスにデータがないともったいないですよね?
于 2010-09-03T15:24:16.777 に答える
1

複数のメンバーに対して同様の機能が必要な場合、コードの重複を避けるために、メンバーへのポインターを使用できる場合があります。別の方法は、列挙型を使用してメンバーを識別し、代わりに配列として格納することです。

struct Foo
{
  float a;
  float b;
};

void Interpolate(const Foo &x, const Foo &y, float f, int Foo::*member)
{
  return x.*member*(1-f)+y.*member*f;
}

int main()
{
  Foo x,y;
  float ia = Interpolate(x,y,0.5,&Foo::a);
  float ib = Interpolate(x,y,0.5,&Foo::b);
}

これは単なるサンプルです。補間は短くて単純ですが、同様の機能が複雑になると、これは非常に有益です。

于 2010-09-03T09:34:34.440 に答える
1

メンバーへのポインターには、関数へのポインターと同様の用途があります。それらが必要になったとき (実際にはめったにありません)、それがわかります。

私が以前に遭遇した可能性のある使用例の 1 つは、テンプレートを使用して、アルゴリズムを特定の動作に特化させることです。唯一の目標は、同じことを繰り返さないことです。

struct foo
{
    double f1(double);
    ...
    double fn(double);
    template <double (foo::*)(double)> double some_algorithm(...);
};

次に、を使用しますa.some_algorithm<a::&fi>(...)

于 2010-09-03T09:41:20.077 に答える
0

メンバーへのポインターについてはあまり心配しません。15年以上のC++で、約10年前に一度使用しました。

言語に既に組み込まれている機能 (つまり、仮想関数) により、メンバー ポインターを手動でいじる必要がなくなります。

于 2010-09-03T09:10:28.353 に答える