我是 C 編程的新手,但在使用以下代碼時遇到了問題:
#include <iostream>
#include <vector>
using namespace std;
class Absolute {
public:
vector<int> nums;
Absolute(vector<int> nums) {
nums = nums; //<--- this size is not 0
}
vector<int> getNums() { return nums; }
int addr() {
int total = 0;
for(int i=0; i<nums.size(); i ) { //<--- nums.size() here is 0 even though it should not be
total = nums[i];
}
return total;
}
};
int main() {
vector<int> numbers = {1, 3, 3, 4, 5, 6, 7, 8}; //<--- passing this to addNums but still returns size of 0
Absolute addNums = Absolute(numbers);
cout << addNums.addr() << endl;
return 0;
}
我的目標是vector使用該addr()方法將所有數字相加,但由于某種原因vector,該方法內部的大小為 0 addr(),所以我最終列印了這些非常大的數字:
15152333321
這里發生了什么?難道是它一開始就沒有被初始化vector嗎?
uj5u.com熱心網友回復:
在這段代碼中:
Absolute(vector<int> nums)
{
nums = nums;
}
你遇到了我所說的“漢蘭達法則”(只能有一個)。在這個函式中,nums指的是引數nums,而不是成員nums。該成員nums被引數遮蔽、隱藏。所以nums = nums;意味著將引數分配給自身。成員nums不變,大小保持為 0。
修復:您可以更改其中一個變數的名稱,以免它們發生沖突。您可以更明確地使用this->nums = nums,但有一個更好更快的選擇:使用成員初始化器串列并使用正確的值初始化成員nums,而不是將其初始化為默認值然后分配它。
Absolute(vector<int> nums): nums(nums)
{
}
您可以在此處使用相同的名稱,因為沒有歧義。該成員nums正在被初始化,所以它必須是最左邊的nums。它被初始化為引數nums,因為引數是識別符號的當前持有者nums。
旁注:考慮通過參考傳遞并為自己保存一份副本:
Absolute(const vector<int> & nums): nums(nums)
{
}
uj5u.com熱心網友回復:
正如@Eljay 所述,您在絕對建構式中的引數和成員變數具有相同的名稱。
這種變化
Absolute(vector<int> nums) {
this->nums = nums; //<--- this size is not 0
}
如果您真的想保持相同的名稱,應該足以讓您的示例作業。我強烈建議您為引數使用不同的名稱,例如_nums 。
uj5u.com熱心網友回復:
這是你的代碼順便說一句
/*
*
*
*
*
*/
#include <iostream>
#include <vector>
using namespace std;
class Absolute {
public:
vector<int> nums;
vector<int> getNums() { return nums; }
int total;
int addr() {
for(int i=0; i<nums.size();i ) { //<--- nums.size() here is 0 even though it should not be
total = nums[i];
}
return total;
}
Absolute(vector<int> num) {
nums = num;
total = 0; //<--- this size is not 0
}
};
int main() {
vector<int> numbers;
numbers.push_back(1);
numbers.push_back(3);
numbers.push_back(3);
numbers.push_back(4);
numbers.push_back(5);
numbers.push_back(6);
numbers.push_back(7);
numbers.push_back(8);
Absolute addNums = Absolute(numbers);
cout << addNums.addr() << endl;
return 0;
}
既然事情在那里,產生正確的結果......請看看以下事實:
- 引數和屬性的名稱相同,我不知道您為什么要這樣做,但那不合適。
- 我將“Total”變數移動到更適合初始化該類物件的變數的另一部分。
- 出于某種原因,我的 Sublime Text 版本對你的向量初始化風格不滿意,(雖然這是有效的),所以我使用了另一個有效的變體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484060.html
下一篇:如何在不復制元素的情況下交換陣列
