我对编程非常陌生,并且即将结束这个程序,但还不能完成最后一个细节,我一直坚持。我试图切换指针* 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;
}
答案 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**
),以便函数能够知道原始参数的位置并直接修改它。