面向对象编程 - 继承 C++,代码不编译

Object Oriented Programming - Inheritance C++, Code does not compile

源代码

#include <iostream>
using namespace std;

class A
{
    private:
        long int a;
    public:
        long int b,x;
        
        void set_a(){
            cout<<"Enter variable A's value (integer) \nAnswer: ";
            cin>>a;
            x=a;
        }
        
        void display_a(){
            cout<<"\n value for Variable A: "<<x<<endl;
        }
        
        void getdata(){
            cout<<"Enter variable B's value (integer) \nAnswer: ";
            cin>>b;
        }
};


class B:public A
{
    private:
      long int prod;
    public:
    
    void prod(){
        prod = x*b;
        }
        
    void display(){
        cout<<"Displaying product of variables A and B \nProduct: "<<prod<<endl;    
        }
};



int main()
{
    A obj;
    B obj2;
    
    obj.set_a();
    obj.display_a();
    obj2.display();
}


编译器错误消息

  37  |         }
      |         ^
main.cpp:31:16: note: previous declaration ‘long int B::prod’
   31 |       long int prod;
      |                ^~~~


我刚刚开始学习面向对象编程的继承函数,所以我是个新手。我相信该程序位于继承函数子 class 中,但我不太确定。

此外,我很确定有一种方法可以检查来自编译器的错误消息的解决方案,但我不知道它是什么或在哪里查看,所以一些帮助会有所帮助

下面描述的代码存在 2 个问题。

问题 1

您有一个方法 prod 与 class B.

中的数据成员 prod 同名

要解决此更改,您可以更改方法或数据成员的名称,使它们与下面所示的不同。

问题 2

该代码具有 未定义的行为,因为您使用的是未初始化数据成员的值 b

解决,请确保 b 在使用其值之前已初始化(或分配),如下所示。同样,prod 未初始化。

此外,您正在创建一个单独的对象 obj 并调用该对象的成员函数。 obj 不同于 B 对象 obj2 中的子对象 A。这已得到修复,并在以下程序中使用注释突出显示,以便您可以看到所做的更改。

class A
{
    private:
        long int a;
    public:
        long int b,x;
        
        void set_a(){
            std::cout<<"Enter variable A's value (integer) \nAnswer: ";
            std::cin>>a;
            x=a;
           
        }
        
        void display_a(){
            std::cout<<"\n value for Variable A: "<<x<<std::endl;
        }
        
        void getdata(){
            std::cout<<"Enter variable B's value (integer) \nAnswer: ";
            std::cin>>b;
        }
};


class B:public A
{
    private:
      long int prod;
    public:
//-------vvvvvvv------------->name changed to product so that it is different from prod data member
    void product(){
        //call these methods here inside product instead of calling them outside on a separater `A` object
        set_a(); 
        getdata();
        display_a();
       
        prod = x*b;
        }
        
    void display(){
        std::cout<<"Displaying product of variables A and B \nProduct: "<<prod<<std::endl;    
        }
};



int main()
{
   //no need to create a separate `A` object
   
    B obj2;
    obj2.product();
    obj2.display();
}

Demo

在上面的程序中,对成员函数 set_agetdatadispaly_a 的调用是从成员函数 product 内部进行的,而不是在单独的函数中调用它们A 对象。