关于#c++#的问题,如何解决?

我想编辑一个关于点 圆 柱体的三个类,然后我在编译圆的时候定义了一个r半径,但编译器一直说[Error] invalid use of non-static data member 'Circle::r'是因为非静态成员变量的原因吗,哪位大佬帮我这个菜鸟解读一下,还要就是显示函数问题我也没搞懂哭了

img

#include
using namespace std;
class Point{
    friend ostream& operator<<(ostream &output,const Point &c){
        cout<","<int x,y;
    public:
        Point(int n=0,int i=0){setPoint(n,i);}
        setPoint(int p,int q){x=p;y=q;}
};
class Circle:public Point{
    protected:
        int r;
    public:
        Circle(int n,int i,int j):Point(n,i){setCircle(j);}
        setCircle(int j){r=j;}
        int Area()const{return r*r*3.14;}
        friend ostream& operator<<(ostream &output,const Circle &c){
        cout<<"Center:"<<"["<","<"]"<"The r="<"area:"<<Area();
        return output;
    }
};
class Cylinder:public Circle{
    protected:
        int h;
    public:
        friend ostream& operator<<(ostream &output,const Cylinder &c){
        cout<<"Center:"<<"["<","<"]"<"The r="<"area:"<<Area();
        cout<<"volume:"<();
        return output;
    }
    Cylinder(int i,int j,int k,int e):Circle(i,j,k){setHigh(e);}
    setHigh(int n){h=n;}
    int volume()const{return Area()*h;}
};
int main(){
    Cylinder obj1(1,2,3,4);
    cout<

帮你修改如下:

#include<iostream>
using namespace std;
class Point{
    friend ostream& operator<<(ostream &output,const Point &c){
        cout<<c.x<<","<<c.y<<endl;return output;
    }
    protected:
        int x,y;
    public:
        Point(int n=0,int i=0){setPoint(n,i);}
        void setPoint(int p,int q){x=p;y=q;}  // 返回值 void
};
class Circle:public Point{
    protected:
        int r;
    public:
        Circle(int n,int i,int j):Point(n,i){setCircle(j);}
        void setCircle(int j){r=j;} // 返回值 void
        int Area()const{return r*r*3.14;}
        friend ostream& operator<<(ostream &output,const Circle &c){
            cout<<"Center:"<<"["<<c.x<<","<<c.y<<"]"<<endl;
            cout<<"The r="<<c.r<<endl; // 修改
            cout<<"area:"<<c.Area(); // 修改
            return output;
        }
};
class Cylinder:public Circle{
    protected:
        int h;
    public:
        friend ostream& operator<<(ostream &output,const Cylinder &c){
            cout<<"Center:"<<"["<<c.x<<","<<c.y<<"]"<<endl;
            cout<<"The r="<<c.r<<endl; // 修改
            cout<<"area:"<<c.Area(); // 修改
            cout<<"volume:"<<c.volume(); // 修改
            return output;
        }
        Cylinder(int i,int j,int k,int e):Circle(i,j,k){setHigh(e);}
        void setHigh(int n){h=n;} // 返回值 void
        int volume()const{return Area()*h;}
};
int main(){
    Cylinder obj1(1,2,3,4);
    cout<<obj1<<endl;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    是的,您的猜测是正确的。编译器提示 "invalid use of non-static data member" 的原因是您在定义圆类时没有把半径参数声明成静态成员变量,导致在使用时产生了错误。具体来说,静态成员变量在类中只会有一个实例,而非静态成员变量在每个类实例中都会有一个实例,如果您想要访问非静态成员变量,请使用类实例作为调用者。因此,推荐您进行如下操作:

    class Circle {
    private:
        static double r; // 将半径参数声明为静态成员变量
        // ... other member variables and functions
    };
    
    double Circle::r = 0.0; // 静态成员变量需要在类外面进行初始化
    
    // 接下来你可以在你的代码中使用r,比如:
    Circle::r = 1.0;
    

    通过这样的方式,您可以在不需要创建类实例的情况下访问半径这个成员变量。

    对于您提到的显示函数的问题,我们需要更多的具体信息才能帮助您解决问题。请提供更多的信息或提交一个新的问题,以便我们可以更好地帮助您解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^