C++指针和类

C++指针和类,c++,class,pointers,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::

在过去的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();
 }

这样它就能编译,而不会泄漏?嗯

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

这样它就能编译,而不会泄漏?嗯

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

我觉得有点不自在,但既然你说这不是家庭作业。。。这是:

class Cpointer {
    C* ptr;
    public:
        Cpointer(C* c) : ptr(c) { }
        ~Cpointer() { delete ptr; }
        C* operator->() { return ptr; }
};
这里有三点:

构造函数获取C*指针并将其存储在改进的类指针中。 当p超出主函数的作用域时,析构函数删除分配给C的对象堆。 重载->运算符,使p->Do;将正确调用C::Do方法。
基本上,要求您实现的是标准auto_ptr类的部分功能。

我觉得发布解决方案有点不舒服,但既然您说这不是一个家庭作业。。。这是:

class Cpointer {
    C* ptr;
    public:
        Cpointer(C* c) : ptr(c) { }
        ~Cpointer() { delete ptr; }
        C* operator->() { return ptr; }
};
这里有三点:

构造函数获取C*指针并将其存储在改进的类指针中。 当p超出主函数的作用域时,析构函数删除分配给C的对象堆。 重载->运算符,使p->Do;将正确调用C::Do方法。
基本上,要求您实现的是标准auto_ptr类的部分功能。

鉴于Cpointer在main中的使用方式,必须按照以下方式实现:

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

问题是C的重写“&”运算符也使用Cpointer,这种实现在这种情况下不起作用。内存损坏会发生,特别是当在堆栈上声明C实例时,通常需要重写的“&”运算符。为了真正正确地工作,必须修改C,或者停止使用Cpointer,或者包含Cpointer管理的引用计数。任何一种方式都违反了C上的“请勿修改”限制。

鉴于Cpointer在main中的使用方式,必须按照以下方式实现:

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

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

 ~Cpointer(){
     delete mptr;
 }

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

问题是C的重写“&”运算符也使用Cpointer,这种实现在这种情况下不起作用。内存损坏会发生,特别是当在堆栈上声明C实例时,通常需要重写的“&”运算符。为了真正正确地工作,必须修改C,或者停止使用Cpointer,或者包含Cpointer管理的引用计数。任何一种方式都违反了C上的“请勿修改”限制。

完成类Cpointer以便代码编译?这是什么无用的家庭作业?你删除了转发声明了吗?应该在CPointer课之前。不,这不是家庭作业。这是我上一次期中考试中的一个问题。提示:Cpointer不需要Do函数,您需要重载运算符。另一个提示:您还需要一个特殊方法来防止内存泄漏。完成类Cpointer以便代码编译?这是什么无用的家庭作业?你删除了转发声明了吗?应该在CPointer课之前。不,这不是家庭作业。这是我上一次期中考试中的一个问题。提示:Cpointer不需要Do函数,您需要重载运算符。另一个提示:您还需要一种特殊方法来防止内存泄漏。是的,我可以这样做,但我不确定这是否是正确答案。看看p->Do;主程序内部的指令。这不会让它编译。忘记重载->。它现在可以编译了。是的,我可以做到,但我不确定它是否是正确的答案。看看p->Do;主程序内部的指令。这不会让它编译。忘记重载->。它现在可以编译了。这太棒了,非常感谢。我不知道为什么我没有考虑重载->操作符。复制Cpointer对象时会出现严重问题—多次删除Cpointer::ptr。请注意,即使调用C::operator&的代码中有一个复制操作,问题也可能不会显示出来,因为编译器被允许省略该复制,而且它们通常都会这样做。事实上,如果将Cpointer用作通用的类指针,Cpointer也会有这样的问题。我知道这项任务相当学术化,因此不需要一般性的解决方案。这个解决方案可能就是我提到的std::auto_ptr。这太棒了,非常感谢。我不知道为什么我没有考虑重载->操作符。复制Cpointer对象时会出现严重问题—多次删除Cpointer::ptr。请注意,即使调用C::operator&的代码中有一个复制操作,问题也可能不会显示出来,因为编译器被允许省略该复制,而且它们通常都会这样做。事实上,如果将Cpointer用作通用的类指针,Cpointer也会有这样的问题。我知道这项任务相当学术化,因此不需要一般性的解决方案。这个解决方案可能是我提到的std::auto_ptr。当我最初阅读这些答案时,我只是瞥了一眼你的析构函数,忽略了其余部分,因为你的答案显然是错误的。很高兴我又看了它一眼+1楼
class C; //forward declaration
class Cpointer {
 public:
 C* mptr;

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

 ~Cpointer(){
     delete mptr;
 }

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

或者指出不一致的要求。当我最初阅读这些答案时,我只是瞥了一眼你的析构函数,忽略了其余的内容,因为你的答案显然是错误的。很高兴我又看了它一眼+1用于指出不一致的要求。