定义了一个类,用指针的方法建立了一个类组。但是在编写一个函数来对这个类组里面的数据进行统计运算的时候出现了问题。程序如下://修正转折角
void AngleCorrect(CPoint *p,int n)
{
int i=0;
CDegree Full(360,0,0),Fact(0,0,0),Perrmit(0,0,60),Err;
for(i=0;i<n-1;i++)
if (p[i]!=NULL)
Fact=Fact+*p[i].Angle;
Err=Fact-Full;
Perrmit=Perrmit*sqrt(5);
Err.Cout();
cout<<"\n";
Perrmit.Cout();
cout<<"\n";
//if (Err<=Perrmit)
//{
for(i=0;i<n-2;i++)
{
*p[i].DAngle=Err/n;
*p[i].CorrectAngle=*p[i].Angle-*p[i].DAngle;
*p[n-1].CorrectAngle=*p[n-1].Angle+*p[i].DAngle;
};
p[n-1].CorrectAngle=p[n-1].CorrectAngle-Err;
//}
}
定义类组的过程如下:
CPoint *AM;
AM=new CPoint[5];

解决方案 »

  1.   

    你函数定义的CPoint *p是指针而不是指向数组的指针你怎么可以用
    if (p[i]!=NULL)
       Fact=Fact+*p[i].Angle;
    应该是
    if(p!=NULL)
       Fact=Fact+p[i].Angel;后面是一样的,不应该使用*p[i]
      

  2.   

    编译也同不过吧?
    if (p[i]!=NULL) -> if((p+i)!=NULL)
    Fact=Fact+*p[i].Angle; -> Fact=Fact + p[i].Angle;
    and so on
      

  3.   

    1.CPoint 是MFC里的点类,不知道这样用有什么后果2.把你的*p[i]改为(*p)[i]就可以了.
      

  4.   

    出去上完课就有这么多人帮忙啊,先谢谢啦我后来试过了,这种指针无法给成员变量附值。我怀疑这边出问题了:
    CPoint *AM;
    AM=new CPoint[5];我对AM[0]的成员变量直接赋值后也是无法正确输出的,我在运行的过程中插入断点观察,AM[0]的成员变量的值为 地址,可能是定义类组的时候用法不对。最近正在开发一个小地区控制测量的软件,刚从VB编程转过来,C++特别不习惯,很多用法不懂,有达人愿意加QQ或者MSN带带我吗?181003559   [email protected]
      

  5.   

    不知道你是怎么调用AngleCorrect(CPoint *p,int n)的?
      

  6.   

    AngleCorrect(AM,5)现在关键不是函数的问题,我不用这个函数而是直接对AM[0]的成员变量进行操作也是失败的AM=new CPoint[5]  这里估计就有问题了
      

  7.   

    //编译可以通过的版本 呵呵
    #include <iostream>
    using namespace std;
    #include <math.h>struct CDegree
    {
    CDegree(){}
    CDegree(int a,int b,int c){};
    int _a;
    int _b;
    int _c;
    void Cout(){};
    CDegree operator + (const CDegree& deg)
    {
    return *this;
    }
    CDegree operator - (const CDegree& deg)
    {
    return *this;
    }
    CDegree operator * (const CDegree& deg)
    {
    return *this;
    }
    CDegree operator / (const CDegree& deg)
    {
    return *this;
    }
    CDegree operator * (float f)
    {
    return *this;
    }
    CDegree operator / (float f)
    {
    return *this;
    }};struct CPoint
    {
    CDegree Angle;
    CDegree DAngle;
    CDegree CorrectAngle;
    };//修正转折角
    void AngleCorrect(CPoint *p,int n)
    {
    int i=0;
    CDegree Full(360,0,0),Fact(0,0,0),Perrmit(0,0,60),Err;
    for(i=0;i<n-1;i++)
    Fact=Fact+p[i].Angle;
    Err=Fact-Full;
    Perrmit=Perrmit*sqrt(5.);
    Err.Cout();
    cout<<"\n";
    Perrmit.Cout();
    cout<<"\n";
    //if (Err<=Perrmit)
    //{
    for(i=0;i<n-2;i++)
    {
    p[i].DAngle=Err/n;
    p[i].CorrectAngle=p[i].Angle-p[i].DAngle;
    p[n-1].CorrectAngle=p[n-1].Angle+p[i].DAngle;
    };
    p[n-1].CorrectAngle=p[n-1].CorrectAngle-Err;
    //}
    }
    void main()
    {
    CPoint *AM;
    AM=new CPoint[5];
    AngleCorrect(AM,sizeof(AM) / sizeof(AM[0]));
    }
      

  8.   

    太感谢了,不过这个好像用的是结构的方法,我想知道为什么我用类不行?
    这个东西我以后还要在CPoint类里面加入对话框进行数据输入,不知道用这种类的方法可不可以实现?还是很谢谢
      

  9.   

    AM=new CPoint[5] 这里估计就有问题了
    AM[0].?1,AM.?2没有赋值?
    那就是CPoint的构造函数有问题了。
      

  10.   

    我如果这接用CPoint单独构造对象,所有的操作都可以完成,数据输出也是对的。
    不会用指针,所以我怀疑AM=new CPoint[5] 有问题,但是不知道问题出在哪里。
      

  11.   

    对了,我想起来了,你的CPoint是没有重载new和delete的
      

  12.   

    能讲得清楚一点吗,是我没有写进去,还是类本身无法完成new和delete?
      

  13.   

    类是可以new和delete的,
    至于怎么new和delete,就要重载new和delete了,就像你重载+,-,*,/一样
      

  14.   

    class CVMShow{
     private:
      static HANDLE m_sHeap;
      static int m_sAllocedInHeap;
     public:
      LPVOID operator new(size_t size);
      void operator delete(LPVOID pVoid);
    }……
    HANDLE m_sHeap = NULL;
    int m_sAllocedInHeap = 0;
    LPVOID CVMShow::operator new(size_t size)
    {
     if (m_sHeap == NULL)
      m_sHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);
      LPVOID pVoid = HeapAlloc(m_sHeap, 0, size);
      if (pVoid == NULL)
       return NULL;
       m_sAllocedInHeap++;
      return pVoid;
    }
    void CVMShow::operator delete(LPVOID pVoid)
    {
     if (HeapFree(m_sHeap, 0, pVoid))
      m_sAllocedInHeap--;
      if (m_sAllocedInHeap == 0)
      {
       if (HeapDestory(m_sHeap))
        m_sHeap = NULL;
      }
    }
      

  15.   

    简单的方法,就是不用new和delete
      

  16.   

    一片不认识的,能简单一点的重载吗?这个好像是API函数里面的一些句柄啊之类的类型名阿~~~~
      

  17.   

    自己不顶不行啊~出去上课,晚上回来,这个问题快解决了,楼上的那个new delete的重载太复杂没看懂,能提供一个简单的就好了。