C++指针和类
在过去的45分钟里,我一直在努力解决这个问题,但是我想不出我应该怎么做。问题是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::
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用于指出不一致的要求。