warning: taking address of temporary

D

daniell

/*
Triangle.cpp
*/

// Use a pure virtual function.

#include <iostream>
#include <cstring>
using namespace std;

// A class for two-dimensional objects.
class TwoDShape {
// these are private
double width;
double height;

// add a name field
char name[20];
public:

// Default constructor.
TwoDShape() {
width = height = 0.0;
strcpy(name, "unknown");
}

// Constructor for TwoDShape.
TwoDShape(double w, double h, char *n) {
width = w;
height = h;
strcpy(name, n);
}

// Construct object with equal width and height.
TwoDShape(double x, char *n) {
width = height = x;
strcpy(name, n);
}

void showDim() {
cout << "Width and height are " << width << " and " << height <<
"\n";
}

// accessor functions
double getWidth() { return width; }
double getHeight() { return height; }
void setWidth(double w) { width = w; }
void setHeight(double h) { height = h; }
char *getName() { return name; }

// area() is now a pure virtual function
virtual double area() = 0;

};

// Triangle is derived from TwoDShape.
class Triangle : public TwoDShape {
char style[20]; //now private
public:

/* A default constructor. This automatically invokes
the default constructor of TwoDShape. */
Triangle() {
strcpy(style, "unknown");
}

// Constructor with three parameters.
Triangle(char *str, double w, double h)
: TwoDShape(w, h, "triangle") {
strcpy(style, str);
}

// Construct an isosceles triangle.
Triangle(double x) : TwoDShape(x, x, "triangle") {
strcpy(style, "isosceles");
}

// This now overrides area() declared in TwoDShape.
double area() {
return getWidth() * getHeight() / 2;
}

void showStyle() {
cout << "Triangle is " << style << "\n";
}
};

int main() {
// declare an array of pointers to TwoDShape objects.
TwoDShape *shapes[4];

shapes[0] = &Triangle("right", 8.0, 12.0);
shapes[1] = &Triangle(3.0);
shapes[2] = &Triangle(4.0);
shapes[3] = &Triangle(7.0);

for(int i=0; i < 2; i++) {
cout << "object is " <<
shapes->getName() << "\n";

cout << "Area is " <<
shapes->area() << "\n";

cout << "\n";
}

return 0;
}

Hi, I'm a beginning programmer. Above is the code that is giving me
the error. I have talked with a professor about this issue. The
error happens on the lines beginning "shapes[0] = ... "

The professor says, because Triangle was created without a variable
they are temporary objects. Which means they will be destroyed and
the pointer becomes a dangling pointer.

I edited the code and just created the objects and gave them a
variable to be stored in. i.e. "Triangle t1("right", 4, 5);" Then I
just do "shapes[0] = &t1;" When I recompile, I get no warnings and it
runs as expected.

My question: Is there a way so that the temporary objects are not
destroyed? Seems like a waste of memory to create a variable outside
of the array that will always be referenced through the array.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top