如何摆脱丑陋的记录

时间:2012-05-10 17:08:56

标签: c++ oop pointers syntax operator-overloading

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;
}

我有一个指向c类的指针c。

有没有办法摆脱这样的记录:

(*cc1->mass)(1);

并写下这样的想法:

cc1->mass(1);

不可能吗?

5 个答案:

答案 0 :(得分:1)

始终可以这样做:

class cc {
    private:
        c *_mass;

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

现在..

cc1->mass()(1);

答案 1 :(得分:1)

如果mass是对象而不是指针,则可以使用所需的语法:

class cc {
  private:

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

…

    cc1->mass(1);

答案 2 :(得分:1)

当我看到标签“c ++”和“操作员重载”时,我的思维警报会亮起。

C ++运算符重载很复杂,有些运算符如“()”或“ - >”让它变得更加困难。

我建议,在重载运算符之前,使用相同的purpouse进行全局函数或方法,测试它是否有效,然后将其替换为运算符。

全球朋友功能示例:

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(...)

请注意,在最后一个示例中,我使用唯一标识符保留该方法。

干杯。

答案 3 :(得分:0)

你可以用

(*(*cc1))(1)

因为operator()应用于对象,而不是指针。

答案 4 :(得分:0)

您可以使用

(**cc1)(1);

或者

cc1->mass->operator()(1);