更改指针指向的内容?

时间:2016-02-12 18:44:39

标签: c++ class pointers

我对编程非常陌生,并且即将结束这个程序,但还不能完成最后一个细节,我一直坚持。我试图切换指针* sp指向的形状,在我看来我正在做的事情应该有效,因为矩形和圆形都是形状;但是,当我编译时,只有颜色的值会发生变化。圆形区域打印而不是矩形区域,周长打印0.任何帮助将不胜感激!

#include <iostream>
#include <string>
using namespace std;
double const pi = 3.1519;
class shape {
    public:
        shape() {};
        shape(string);
        virtual double getCircumference() {
            return 0;
        };
        virtual double getPerimeter() {
            return 0;
        };
        virtual double getArea() {
            return 0;
        };
        string getColor();


    protected:
        string color;

};

string shape::getColor() {
    return color;
}

class circle : public shape {
public:

    circle(double r, string c) {

        radius = r;
        color = c;
    };
    double getArea();
    double getCircumference();


private:
    double radius;


};
double circle::getCircumference() {
    return pi * radius * 2;
}
double circle::getArea() {
    return pi * radius * radius;
}
class rectangle:public shape {

public:

    rectangle(double w, double l, string c) {
        width = w;
        length = l;
        color = c;
    };

    double getArea();
    double getPerimeter();

private:
    double length;
    double width;

};
double rectangle::getPerimeter() {
    return width * 2 + length * 2;
}
double rectangle::getArea() {
    return length * width;
}
void change(shape *sp, shape *sp1) {
    *sp = *sp1;
}
int main() {

    circle mary(3.2, "Green");
    shape *sp = new circle(4.5, "Yellow");

    cout << "Circle #1 is " << mary.getColor() << endl;
    cout << "Circle #1 has an area of " << mary.getArea() << endl;
    cout << "Circle #1 has a circumference of " << mary.getCircumference() << endl << endl;
    cout << "Circle #2 is " << sp->getColor() << endl;
    cout << "Circle #2 has an area of " << sp->getArea() << endl;
    cout << "Circle #2 has a circumference of " << sp->getCircumference() << endl << endl;

    shape *sp1 = new rectangle(1.0, 2.1, "Red");

    change(sp, sp1);

    cout << "Rectangle #1 is " << sp->getColor() << endl;
    cout << "Rectangle #1 has an area of " << sp->getArea() << endl;
    cout << "Rectangle #1 has a perimeter of " << sp->getPerimeter() <<endl<< endl;

}

3 个答案:

答案 0 :(得分:1)

如果您尝试更改指针的地址,则必须通过引用传递指针。试试这个:

void change(shape *&sp, shape *&sp1)

答案 1 :(得分:1)

重要的是要记住使用指针的各种不同方式的含义。在你的程序中,sp引用指针本身 - 即一个内存位置,告诉计算机在哪里找到一个对象。 *sp中的星号是'取消引用'运算符;它需要一个指针,并为您提供它所指向的东西。

考虑到这一点,你的第*sp = *sp1;行说'采取sp指向的东西,并将其设置为等于sp1所指向的东西“换句话说,您正在更改sp指向的对象的值,而不是sp本身的值。要将sp指向sp1指向的对象,您需要sp = sp1;而不使用星号。

另外要记住的是,C ++默认按值传递函数参数:调用函数时,复制参数,函数对副本进行操作。这意味着原始参数本身不能被像这样工作的函数改变。在参数声明中添加&符号,如void change(shape *&sp, shape *sp1)会导致第一个参数通过引用传递:函数操作的对象与调用代码传入的对象相同。这允许函数更改作为参数传递的对象,并在函数返回后保留这些更改。

对不起,答案很长:我本可以给你一些符合你想要的东西,但我想你可能会理解为什么事情按照他们的方式运作的原因。

答案 2 :(得分:0)

指针按值传递,即使它是指针。

这意味着您实际上是按值传递地址,因此参数是原始参数的副本。

想想

void sum(int a, int b, int result);
void foo() {
  int result;
  sum(5,10,result);
}

虽然您希望能够将结果存储到传递给sum参数的变量中,但由于result按值传递并因此被复制,因此您将无法执行此操作。您在方法中对result所做的每一次修改都将是方法的本地修改。

这是完全相同的事情,指针只不过是一个地址,如果你按值传递它,那么传递地址的副本,但对局部变量的每次修改都只是本地的。

这就是为什么你必须使用引用,如果你想要能够修改它们的值,就像其他每个变量一样,所以你会有

void sum(int a, int b, int& result);
void change(shape*& shape1, shape*& shape2);

这个,在引擎盖下,将地址传递给存储地址的变量(一种shape**),以便函数能够知道原始参数的位置并直接修改它。