面向对象编程 - 继承 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();
}
在上面的程序中,对成员函数 set_a
、getdata
和 dispaly_a
的调用是从成员函数 product
内部进行的,而不是在单独的函数中调用它们A
对象。
源代码
#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();
}
在上面的程序中,对成员函数 set_a
、getdata
和 dispaly_a
的调用是从成员函数 product
内部进行的,而不是在单独的函数中调用它们A
对象。