注册 登录
编程论坛 C++教室

死活也找不出哪儿出问题了?

hcs_xiaohan 发布于 2016-12-23 19:15, 1636 次点击
程序目的是计算圆的面积和表面积,代码有点长但是一点也不复杂, 请各位看看是哪儿出问题了?

#include <string>
#include <cmath>
#include <iostream>

using namespace std;

enum eColor {None, green, yellow, blue, red, black, white};

class Color {
protected:
    eColor mColor;

public:
    Color(eColor _Color);
    void setColor(eColor Color);
    eColor getColor() {return mColor;}
    string getStrColor();
};

Color::Color(eColor _Color) {
    mColor = _Color;
}

void Color::setColor(eColor Color) {
    mColor = Color;
}

string Color::getStrColor() {
    switch(mColor) {
        case green: return "green";
        case yellow: return "yelloe";
        case blue: return "blue";
        case red: return "red";
        case black: return "black";
        case white: return "white";
        default: return "none";
    }
}


template <typename T>
class Circle: public Color {
protected:
    T x;
    T y;
    T radius;

public:
    Circle(T const & _x, T const & _y, T const & _radius, eColor color);
    Circle(T const & _x, T const & _y, T const & _radius);
    Circle(T const & _radius);

    T & area() ;
    T & circumference() ;
    T & getx() {return x;}
    T & gety() {return y;};
    T & getradius() {return radius;}

};

template <typename T>
Circle<T>::Circle(T const & _x, T const & _y, T const & _radius, eColor color): Color(color) {
    x = _x;
    y = _y;
    radius = _radius;

}

template <typename T>
Circle<T>::Circle(T const & _x, T const & _y, T const & _radius) {
    x = _x;
    y = _y;
    radius = _radius;
}

template <typename T>
Circle<T>::Circle(T const & _radius) {
    x = const_cast<T>(0);
    y = const_cast<T>(0);
    radius = _radius;
}

template <typename T>
T & Circle<T>::area() {
    return M_PI * radius * radius;
}

template <typename T>
T & Circle<T>::circumference() {
    return const_cast<T>(2) * M_PI * radius;   
}


int main() {
    Circle<float> demo(0.0, 0.0, 10.0, white);
    cout << "area:" << demo.area() << endl;
    cout << "color:" << demo.getStrColor() << endl;

    return 0;
}

这是报错信息:

test.cpp: In instantiation of ‘T& Circle<T>::area() [with T = float]’:
test.cpp:96:34:   required from here
test.cpp:85:28: error: invalid initialization of non-const reference of type ‘float&’ from an rvalue of type ‘float’
     return M_PI * radius * radius;
3 回复
#2
rjsp2016-12-23 20:22
template <typename T>
T& Circle<T>::area() {
    return M_PI * radius * radius;
}

返回类型应当是引用吗?
#3
hcs_xiaohan2016-12-23 21:29
回复 2楼 rjsp
去掉应用就可以运行了, 但如果用引用的话main() 函数该怎么改?
#4
yangfrancis2016-12-23 23:34
从逻辑上来理解压根就不该返回引用。
1