0

当我尝试输入 x pt.1 的任何坐标时,我的程序只是挂起。

任何人都可以帮助我吗?

// shape.h
#include <string>
#ifndef SHAPE_H
#define SHAPE_H 1
using namespace std;

class Shape
{

protected:
    int x, y;
    string name;
public:
// a simple inline constructor
    Shape(int new_x, int new_y, string new_name): x(new_x), y(new_y), name(new_name)
    {
        return;
    };

    virtual ~Shape()
    {
        return;
    };
// inline getter/setter functions
    string getName() { return name; };
    void setName(string new_name)
    {
        name = new_name;
    }

    int getX() { return x; };
    void setX(int set_x)
    {
        x = set_x;
    }

    int getY() { return y; };
    void setY(int set_y)
    {
        y = set_y;
    }

    void toString();
};
#endif 

形状标题。这个程序也是关于继承的..

// square.h
#ifndef SQUARE_H
#define SQUARE_H 1
#include <string>
#include "Shape.h"
using namespace std;

class Square : public Shape
{
protected:
int size;
public:
// a c'tor that calls the parent class's c'tor
Square(int new_x, int new_y, string new_name): Shape(new_x, new_y, new_name)
{
    return;
};

void setXY();
Square *arraySquare[1];
};

void Square::setXY()
{
int count = 0;
for(int i=0; i<4; i++)
{
    cout<<"Please enter x-ordinate of pt. "<<i+1<<" : ";
    cin>>x;
    arraySquare[count]->setX(x);
    cout<<"Please enter y-ordinate of pt. "<<i+1<<" : ";
    cin>>y;
    arraySquare[count]->setY(y);
    count++;
}
}

#endif  

方形标题..形状的子类..

#include <iostream>
#include <string>
#include "Shape.h"
#include "Square.h"
using namespace std;

class Main
{
public:
    void mainMenu();
    char menuChoice;
    void stringToUpper(string &s);
};

void stringToUpper(string &s)
{
    for(unsigned int l = 0; l < s.length(); l++)
    {
        s[l] = toupper(s[l]);
    }
}

void Main::mainMenu()
{
    cout<<"Welcome to Main program!"<<endl<<endl;
    cout<<"1)   Input data"<<endl;
    cout<<"2)   2"<<endl;
    cout<<"3)   3"<<endl;
    cout<<"4)   4"<<endl;
    cout<<"Q)   Enter 'Q' to quit"<<endl<<endl;
}

int main()
{
    char menuChoice;

    bool quit=false;
    Main main;
    Square *square;

    string shape, special;

    while ( !quit )
    {
        main.mainMenu();
        cout<<"Please enter your choice : ";
        cin>>menuChoice;
        menuChoice = toupper(menuChoice);

        switch(menuChoice)
        {
            case '1':
            cout<<endl<<"[ Input data ]"<<endl;
            cout<<"Please enter name of shape : "<<endl;
            cin>>shape;
            stringToUpper(shape);
            if(shape=="SQUARE")
            {
                square->setXY();
            }
            break;
            case '2':
            cout<<"Print"<<endl<<endl;
            break;           
            case '3':
            cout<<"You choosen 3"<<endl<<endl;
            break;                   
            case '4':
            cout<<"You choosen 4"<<endl<<endl;
            break;
            case 'Q':
            cout<<"You have chosen to quit!"<<endl<<endl;
            quit=true;
            exit(0);                 
            default:
            cout<<"Invalid entry!"<<endl<<endl;
            break;
        }
    }
}

这是程序的脸..

每当我运行它并输入第一个坐标 x 时,它就会挂起。任何人都可以帮忙吗?

4

1 回答 1

1

您的程序挂起,因为它访问未分配的对象。每次看到指针声明时,都必须应用 3 条规则: a) 它是否设置为默认值?b) 是否已分配/分配?c) 它被删除了吗?

在类 Square 中,您已经声明了这个数据成员:

Square *arraySquare[1];

因此,Square 类型的对象有一个包含 1 个指向 Square 的指针的数组。(我相信您应该使用 Shape 而不是 Square。)您必须分配一个 Square 并将其放入arraySquare(规则 b)。由于您有一个指针,因此您应该NULL在构造函数中将其设置为(规则 a),并且必须在析构函数中将其删除(规则 c)。

然后在setXY()你想设置 4 对 X&Y,但arraySquare只有 1 个实例的空间并且它没有被分配。一个简单的解决方法是修改 arraySquare 的定义,使其具有 4 个指针的数组,而不是只有 1 个。在 for 循环中设置 X 和 Y 之前,如果它仍然为 NULL,则必须分配一个 Square 实例(setXY()允许在同一个对象上多次调用)。现在您有 4 个指针,您必须更新构造函数以将所有 4 个指针设置为 NULL,并更新析构函数以删除所有 4 个指针。

main()中,您还使用指针。我把它留给你来应用规则。

注意:使用 Point 类型会更清楚,因为我们通常说“一个正方形有 4 个角/点”。通过使用 Square an arraySquare,Square 的每个角落都有自己的“名称”。

于 2012-11-02T23:43:43.393 回答