我试图声明一个新形状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;
};
答案 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
这里只是一个指向无意义内存位置的指针。