warning: taking address of temporary

Discussion in 'C++' started by daniell@digitalfiling.com, May 8, 2007.

  1. Guest

    /*
    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.
     
    , May 8, 2007
    #1
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Henning Hasemann
    Replies:
    17
    Views:
    1,148
    mangesh
    Jun 30, 2006
  2. Replies:
    3
    Views:
    733
  3. Replies:
    7
    Views:
    3,224
    James Kanze
    Feb 12, 2008
  4. Andy Gibbs
    Replies:
    5
    Views:
    4,058
    Andy Gibbs
    Nov 19, 2008
  5. V.Subramanian, India

    taking address of temporary object

    V.Subramanian, India, Feb 10, 2012, in forum: C++
    Replies:
    2
    Views:
    1,038
    Alf P. Steinbach
    Feb 10, 2012
Loading...

Share This Page