我正在嘗試學習 C 并弄清楚如何訪問作為物件陣列的私有成員變數。我的目標是嘗試列印出物件陣列中的資料。假設我的標題看起來像這樣。
using namespace std;
const unsigned MAX_RESULTS = 10;
class StudentRecords{
public:
StudentRecords();
//bunch of other getters and setters here
Result GetResults() const; //my lame attempt at trying to access the obj-array private var
private:
Result results[MAX_RESULTS]; // array of Result of MAX_RESULTS number of elements
// other private variables
};
ostream& operator <<( ostream& os, const StudentRecords& R);
在上面,應該有一個名為 results 的私有 Result 物件陣列,它的大小為 MAX_RESULTS,這里應該是 10。現在,使用我的多載運算子 << 的想法是將 Result 的內容列印到“檔案”以便說話。由于它是一個陣列,我想使用 for 回圈列印出陣列中的所有結果。
Result StudentRecords::GetResults() const
{
return results[MAX_RESULTS];
}
ostream & operator <<( ostream & os, const StudentRecords& R )
{
for(unsigned i = 0; i < SomeNumber; i )
{
os << R.GetResults()[i] << '\n'; //this won't work of course see error
}
return os;
}
會有一個錯誤說明:
error: no match for 'operator[]' (operand types are 'Result' and 'unsigned int')|
我已經在我的 Result 類中多載了 << 運算子,以便列印出該類中的值。問題是我不知道如何遍歷結果陣列。根據我的谷歌搜索,我了解到您可以在這里使用某種指標函式:C : Setters and Getters for Arrays
當我嘗試撰寫這樣的函式時:
Result* GetResults() const;
我會收到一條錯誤訊息:
error: cannot convert 'const Result' to 'Result*' in return|
省略 * 可以編譯代碼,但可以預見的是,我會從陣列中得到一堆垃圾值。所以假設我的類有一個物件陣列,并且這些物件有自己的變數,我如何列印出我的物件陣列中的值?我很感激幫助。
uj5u.com熱心網友回復:
Result StudentRecords::GetResults() const
{
return results[MAX_RESULTS];
}
這是新手常見的誤區。因為您宣告了陣列,因為results[MAX_RESULTS]您認為這results[MAX_RESULTS]意味著整個陣列。但事實并非如此,當您使用陣列時,它[]會用于訪問陣列的各個元素。當然 index 沒有元素MAX_RESULTS,它超過了陣列的末尾。
底線是宣告的語法和運算式的語法是不一樣的。
你可以做這樣的事情
const Result* StudentRecords::GetResults() const
{
return results;
}
這將回傳一個指向陣列的指標,而不是陣列本身(這在 C 中實際上是不可能的)。但現在應該已經足夠接近了。
uj5u.com熱心網友回復:
一種方法是使輸出函式成為類的一部分,以便它可以results直接訪問陣列。雖然operator<<不能真正成為您班級的一部分,但您可以通過將其宣告為朋友來使其在邏輯上成為班級的一部分。
class StudentRecords {
friend ostream& operator <<( ost& os, const StudentRecords& R);
// Rest of the class definition
};
ostream & operator <<(ostream & os, const StudentRecords& R)
{
for(unsigned i = 0; i < MAX_RESULTS; i ) {
os << R.results[i] << '\n';
}
return os;
}
或者,您可以通過定義一個列印陣列并operator<<呼叫該成員的成員函式來避免友誼。
class StudentRecords {
public:
void print_to(std::ostream& os) const
{
for(unsigned i = 0; i < MAX_RESULTS; i ) {
os << results[i] << '\n';
}
}
// Rest of the class definition
};
ostream & operator <<(ostream & os, const StudentRecords& R)
{
R.print_to(os);
return os;
}
請注意,這種方法適用于類外沒有其他任何東西需要訪問results陣列的情況。如果您需要對陣列的外部訪問,您不妨修復您的吸氣劑(如其他答案)并使用該公共訪問進行列印。
uj5u.com熱心網友回復:
正如許多人所指出的,在解決這個問題時有很多事情需要考慮。
- 物件陣列的 getter 可以采用索引號(舊的 int i)來定位陣列內的元素。例如 R.GetResult(i)
- 宣告不是運算式!在我的吸氣劑中,我使用了運算式“return results[MAX_RESULTS];” 其中 MAX_RESULTS 是一個常數......但這最終意味著在 MAX_RESULTS-th 元素處回傳陣列,顯然不是有意的。
- 我將來要嘗試的一件事是創建一個指向陣列成員變數的指標函式。
- 建議快速了解向量,因為宣告了“Result results[MAX_RESULTS];” 就是,用評論員的話來說,“C 和 C 的邪惡組合,讓事情變得比他們需要的更復雜,而且在未來的道路上。”
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/490362.html
下一篇:如何使頁面上的影像和文本均勻居中
