我正在嘗試學習面向物件的編程,但遇到了一個問題。我有兩個班級A和B. 我將命令列引數傳遞給 class A,然后它執行一些計算并形成一個二維向量。(讓我們呼叫向量data)
我希望 classB繼承 class A。
所以我想知道有什么方法可以在B呼叫類的默認建構式時列印 2d vector 的內容data。
我嘗試過的示例代碼
class A
{
public:
vector<vector<string>>data;
fstream file;
string word, filename;
A()
{
}
A(string fileOpen)
{
file.open(fileOpen);
while (file >> word)
{
vector<string>rowTemp={word};
data.push_back(rowTemp);
}
}
vector<vector<string>> getVector()
{
return data;
}
};
class B:A
{
public:
B()
{
for(auto i:data)
{
for(auto j:i)
{
cout<<j<<' ';
}
cout<<endl;
}
}
};
int main(int argc, char* argv[]){
fstream file;
string word, filename;
file.open(argv[1]);
string fileOpen=argv[1];
A s(fileOpen);
B c;
return 0;
}
我基本上希望 B 類可以訪問 2d 向量,data以便我可以對其執行進一步的計算,而計算邏輯仍然在 class 中B。
有沒有辦法做到這一點?
此外,正如您在類內部看到A的,默認建構式是空的。但它是必需的,因為沒有它,我收到一個錯誤,即B無法呼叫類的默認建構式。有沒有更好的方法來寫這個?因為有一個空的默認建構式看起來很糟糕。
uj5u.com熱心網友回復:
您似乎誤解了繼承的作業原理,只是不清楚您的期望。問題是:基類的成員總是被繼承的。他們的訪問可能受到限制,但他們仍然存在。
考慮這個簡化的例子:
#include <iostream>
class A {
public:
int data = 42;
A() = default;
A(int value) : data(value) {}
int getData() { return data; }
};
class B : A {
public:
B() {
std::cout << A::data; // ok
std::cout << A::getData(); // ok
}
};
int main(){
B c;
//std::cout << c.data; // error: data is private!
}
輸出是:
4242
因為B確實data從A. 在內部,B您可以data直接訪問或通過訪問,getData因為兩者都public在A. 然而,由于B私自從繼承A(多數民眾贊成通過定義類的默認繼承class),你不能直接訪問或者data也不getData在main。
此外,當你寫:
A s(fileOpen);
B c;
然后s和c是兩個完全不相關的物件。我想你更想要:
B c{fileOpen};
并A從 的建構式呼叫s 建構式B:
B(const std::string& filename) : A(filename) {
// now you can access A::data
// which has been initialized in
// constructor of A
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/323891.html
下一篇:正確使用屬性的方法
