源代碼
#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;
| ^~~~
我剛剛開始從面向物件編程中學習繼承函式,所以我還是個新手。我相信該程式位于繼承函式子類中,但我不太確定。
另外,我很確定有一種方法可以檢查來自編譯器的錯誤訊息的解決方案,但我不知道它是什么或在哪里看,所以一些幫助會有所幫助
uj5u.com熱心網友回復:
您的代碼有兩個問題,如下所述。
問題 1
您有一個與classprod中的資料成員同名的方法。prodB
要解決此更改,您可以更改方法的名稱或資料成員的名稱,使它們與下面所示的不同。
問題 2
代碼具有未定義的行為,因為您使用的是未初始化資料成員的值b。
要解決此問題,請確保b在使用其值之前對其進行初始化(或分配),如下所示。同樣,prod未初始化。
此外,您正在創建一個單獨的物件obj并呼叫該物件的成員函式。這obj與objectA內部的子B物件不同obj2。這已修復并使用以下程式中的注釋突出顯示,以便您可以看到所做的更改。
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_aproductA
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/475362.html
