C ++指针和类

时间:2011-07-23 19:25:53

标签: c++ class pointers

尝试在最后45分钟内解决这个问题,但无法弄清楚我想要做什么。这是问题所在。

class C; //forward declaration
class Cpointer {
 public:

};

class C { //do not modify
   int i;
  public:
   C(int _i=0) : i(_i) {}
   Cpointer operator& () { return Cpointer(this); }
   void Do() { std::cout << "i=" << i << std::endl; }
 };


 int main() {
   Cpointer p (new C(100));
   p->Do();
 }

完成类Cpointer以便代码编译。确保没有内存泄漏。

据我所知,CPointer类将C类作为构造函数的参数。 当我尝试下面的代码时,我收到编译器错误 在CPointer的Do函数中使用“未定义的类型C”。

class Cpointer
{
 C* mCptr;
   public:
  Cpointer(C* cptr) : mCptr(cptr){}
  void Do()
  {
    //mCptr->Do();
  }
};

4 个答案:

答案 0 :(得分:2)

我觉得发布解决方案有些不安,但是因为你说这不是作业......这就是:

class Cpointer {
    C* ptr;
    public:
        Cpointer(C* c) : ptr(c) { }
        ~Cpointer() { delete ptr; }
        C* operator->() { return ptr; }
};

这里有三点:

  1. 构造函数,用于获取C*指针并将其存储在改进的指针式类中。
  2. 析构函数,以便在C超出p函数范围时删除对象堆分配的main
  3. 重载->运算符,以便p->Do();正确调用C::Do方法。
  4. 基本上,您要求实现的是标准auto_ptr类的部分功能。

答案 1 :(得分:2)

考虑到在main()中使用Cpointer的方式,它必须像这样实现:

class Cpointer
{
private:
    C* c:
public:
    Cpointer(C* _c) : c(_c) {}
    ~Cpointer() { delete c; }
    C* operator ->() { return c; }
};

问题在于C的覆盖'&amp;'也使用Cpointer运算符,这种实现不适用于该用法。内存损坏将发生,特别是如果在堆栈上声明C实例(通常需要覆盖'&amp;'运算符)。要真正使这项工作正常,必须修改C,要么停止使用Cpointer,要么包含Cpointer管理的引用计数。无论哪种方式都违反了对C的“不要修改”限制。

答案 2 :(得分:0)

这样它编译,不泄漏?确定。

class Cpointer
{
   public:
   Cpointer(C* c)
   {  delete c; }
  void Do()
  {  }
   Cpointer* operator ->()
   { return this; }
};

答案 3 :(得分:0)

class C; //forward declaration
class Cpointer {
 public:
 C* mptr;

 Cpointer(C *cptr){
     mptr = cptr;
 }

 ~Cpointer(){
     delete mptr;
 }

 C* operator->() const {
     return mptr;
 }
};