无法为数组C ++添加形状

时间:2016-12-11 16:11:05

标签: c++ arrays

我试图声明一个新形状Square然后将一个圆圈添加到同一个数组Shape中,这是一个抽象类。

我有点困惑,因为我没有收到任何错误,但程序只是崩溃(但在删除代码时有效)

主:

#include "Shape.h"
#include "Square.h"
#include <iostream>

using namespace std;

int main(int argc, char **argv) {   
    Shape *shapesArray[6];
    Square *s;
    s->setValues(1.0f, 2.0f, 3.0f, 4.0f);
    shapesArray[0] = s;

    printf("hello world\n");
    return 0;
}

Square.cpp:

#include "Square.h"

void Square::setValues(float w, float x, float y, float z){
    this->w = w;
    this->x = x;
    this->y = y;
    this->z = z;
}

Square.h:

#include "Shape.h"

using namespace std;

class Square: public Shape
{
    float w,x,y,z;

public:
    void setValues(float,float,float,float);
    Square();
};

Shape.cpp

#include <iostream>

using namespace std;

// Base class
class Shape {
public:
    // pure virtual function providing interface framework.
    virtual int getArea() = 0;
    Shape();

protected:
    int radius;
    float x;
    float y;
    float w;
    float z;
};

2 个答案:

答案 0 :(得分:1)

Square *s;

这并不会导致s指向任何特定的事物。在此状态下使用s的值是未定义的行为。您必须先初始化s才能使用它。

通常你会像这样初始化它:

Square *s = new Square;

但是如果你这样做,你会发现你有一个未解决的引用错误。请阅读this question and answer有关此错误的信息。同时你可以删除这些行:

Square();
Shape();

如果您觉得您的类需要构造函数,请使用定义添加它们。请注意,构造函数是setValues之类函数的绝佳替代品。

答案 1 :(得分:0)

您需要通过在第9行的Main中调用Square* s = new Square();来初始化Square对象。在您的代码中,还没有对象实例,因此您无法调用s->setValues(1.0f, 2.0f, 3.0f, 4.0f);之类的函数。 s这里只是一个指向无意义内存位置的指针。