2015-02-08 83 views
-1

我目前正在学习C++并尝试一些愚蠢而简单的事情。这里是我的课:C++创建对象以外的类

 class CRectangle 
      { 
       int x,y; 
      public: 
       // CRectangle(){}; 
       int pb; 
       int *ptr; 
       void setValues(int,int); 
       int* allocateArray(int); 
       void changeVariable(CRectangle); 
       friend void mett(); // !! 
       ~CRectangle(); 
      }; 

     void CRectangle::setValues(int a, int b) 
     { 
      x = a; 
      y = b; 
     } 

     void mett() 
     { 
      CRectangle t; 
      t.x =2; 
      t.pb = 3; 
      t.setValues(5,5); 
     } 

     void CRectangle::changeVariable(CRectangle obj) 
     { 
      (*this).pb = obj.pb; 
      //obj.pb = 50; 
     } 
     CRectangle::~CRectangle() 
     { 
     //delete [] ptr; 
     } 

在main方法中,我已经尝试了两件事情:
第一种:

int main() 
{ 
mett(); 
} 

我只是在METT创建一个类的对象()方法,并提出了一些变数分配,但它会引发访问冲突错误。我试图将方法定义为朋友,这并不重要。同样的错误。还试着用全局CRectangle对象,结果是一样的。

第二个:

int main() 
{ 
    CRectangle obj; 
    CRectangle obj2; 
    obj.pb = 100; 
    obj2.pb = 180; 
    cout << obj.pb << "\n"; 
    obj.changeVariable(obj2); 
    cout << obj.pb << endl; 
} 

同样,当我试试这个,它会引发访问冲突错误。通过将CRectangle参数定义为const CRectangle & obj,我解决了问题 ,但是仍然很好奇错误的原因。

预先感谢

编辑:这个问题是试图删除未初始化的指针在析构函数。我一开始并没有说,认为它非常不相关。对不起。

+0

你的'〜CRectangle'析构函数是否用'ptr'(它从未被初始化)做过什么? – aschepler 2015-02-08 23:40:54

+0

是的,我删除了它。 – nihirus 2015-02-08 23:41:55

+0

请使用智能指针代替原始指针 – 2015-02-08 23:52:56

回答

2

您发布的代码编译,链接(一旦定义了缺少的析构函数),并且运行没有任何问题。

我发现您发布的代码部分没有任何问题。你的问题在于你遗漏的班级中的某些部分。

根据其他类方法和某些类成员的名称,很明显您的类会分配和释放堆上的某些存储。几乎可以肯定的是,你的错误在于你的代码部分。

+0

嗯,我从来没有使用allocateArray方法,而试图运行mett()。刚才我删除了所有不必要的方法,我没有使用并再次尝试,得到了同样的错误,使用visual studio 2012.你会粘贴你的工作代码到pastebin并发送到这里吗?我会非常感激 – nihirus 2015-02-08 23:52:23

+0

http://pastebin.com/FCrYMUqd是你发布的确切代码,没有任何变化。工作正常。 – 2015-02-09 01:05:38

+0

谢谢,看来我的问题是在析构函数中删除一个指针(从未初始化)。 – nihirus 2015-02-09 11:33:38