0
class c {
    private:
        int n[10];
    public:
        c();
        ~c();
        int operator()(int i) { return n[i];};
};

class cc {
    private:

    public:
        c *mass;
        cc();
        ~cc();
        c& operator*() const {return *mass;};
};
int somfunc() {
    c *c1 = new c();

    cc * cc1 = new cc();

    (*cc1->mass)(1);



    delete c1;
}

クラスccからクラスcへのポインタがあります。

このような記録を取り除く方法はありますか?

(*cc1->mass)(1);

そしてそのような何かを書く:

cc1->mass(1);

それは不可能ですか?

4

5 に答える 5

1

常にこれを行うことができます:

class cc {
    private:
        c *_mass;

    public:
        c& mass() const {return *_mass;};
};

今..

cc1->mass()(1);
于 2012-05-10T17:15:29.873 に答える
1

ポインタではなくオブジェクトの場合massは、必要な構文を使用できます。

class cc {
  private:

  public:
    c mass;
    cc();
    ~cc();
    const c& operator*() const {return mass;};
};

…

    cc1->mass(1);
于 2012-05-10T17:50:37.580 に答える
1

「c++」と「演算子のオーバーロード」のタグを見たとき、マインドアラームがオンになります。

C ++演算子のオーバーロードは複雑であり、「()」や「->」などの一部の演算子はそれをより困難にします。

演算子をオーバーロードする前に、同じ目的でグローバル関数またはメソッドを作成し、それが機能することをテストして、後で演算子に置き換えることをお勧めします。

グローバルフレンド関数の例:

class c {
    private:
        int n[10];      

    public:
        c();
        ~c();

        // int operator()(int i) { return n[i]; } 

        // there is a friend global function, that when receives a "c" object,
        // as a parameter, or declares a "c" object, as a local variable,
        // this function, will have access to the "public" members of "c" objects,
        // the "thisref" will be removed, when turned into a method
        friend int c_subscript(c thisref, int i) ;
};

int c_subscript(c* thisref, int i)
{
  return c->n[i];
}

int main()
{
  c* objC() = new c();
  // do something with "objcC"

  int x = c_subscript(objC, 3);
  // do something with "x"

  return 0;
} // int main(...)

ローカル関数(「メソッド」)の例:

class c {
    private:
        int n[10];      

    public:
        c();
        ~c();

        // int operator()(int i) { return n[i]; }

        int subscript(int i) ;
};

int c::subscript(int i)
{
  return this.n[i];
}

int main()
{
  c* objC() = new c();
  // do something with "objcC"

  int x = c->subscript(objC, 3);
  // do something with "x"

  return 0;
} // int main(...)

そして、最後にオーバーロードされた演算子を使用します。

class c {
    private:
        int n[10];      

    public:
        c();
        ~c();   

        int subscript(int i) ;

        int operator()(int i) { return this.subscript(i); }
};

int c::subscript(int i)
{
  return this.n[i];
}

int main()
{
  c* objC() = new c();
  // do something with "objcC"

  int x = c->subscript(3);
  // do something with "x"

  int x = c(3);
  // do something with "x"

  return 0;
} // int main(...)

最後の例では、メソッドを一意の識別子で保持していることに注意してください。

乾杯。

于 2012-05-10T22:55:22.193 に答える
0

あなたは

(*(*cc1))(1)

operator()ポインタではなくオブジェクトに適用されるためです。

于 2012-05-10T17:11:41.140 に答える
0

使用できます

(**cc1)(1);

または

cc1->mass->operator()(1);
于 2012-05-10T17:12:24.243 に答える