【发布时间】:2021-11-27 01:22:52
【问题描述】:
我是 Cpp 的新手,我只是想构建一个非常基本的“Circle”类。下面是我的代码
#include <iostream>
#include <cmath>
#include <typeinfo>
class Circle {
private:
const double pi = 3.14159265358979323846;
double radius;
double area;
double perimeter;
public:
void set_rad(double rad){
radius = rad;
area = pi*pow(rad,2);
perimeter = 2*pi*rad;
}
double get_attr() {
double circle_attr[3] = {radius, area, perimeter};
std::cout << typeid(circle_attr).name() << std::endl;
return *circle_attr;
}
};
int main(){
Circle aCircle;
aCircle.set_rad(5);
aCircle.get_attr();
return 0;
}
代码运行并按预期运行。但是,如果在方法get_attr 的返回行中,我将*circle_attr 替换为circle_attr,那么我会收到错误cannot convert 'double*' to 'double' in return。但是,circle_attr 已经是一个双精度数组。这就是我将它初始化的内容,也是 Cpp 告诉我的内容,因为当我调用 typeid(circle_attr).name() 时,我会返回 A3_d,我认为它是 Array3_double 的缩写。那么这里发生了什么?
【问题讨论】:
-
问问自己:双精度数组与单个双精度数相同吗?至于为什么编译器认为你的数组现在是一个指针,见:stackoverflow.com/questions/1461432/…
-
当然可以,但是如果我想让一个函数返回一个双精度数组,我还能如何声明它呢?
-
如果您可以使用 C++11 或更高版本,则切换到使用
std::array。如果不能,请创建自己的数组类。普通 C 数组是类型系统中的二等公民,如果可以避免此类问题,应避免使用。 -
这是我会使用
struct的东西。您可以使用几个通用容器,但struct允许您为所有成员提供易于阅读的名称。一旦你在最近的 C++ 标准中有 structured bindings 就不是那么重要了,但是如果你像我一样坚持老派,那么增加的易读性就值得它的黄金重量。 -
" 如果我希望它返回一个双精度数组" --> 代码不能返回原始 array。