如何使變數m_i對每個物件都有自己的值,并且在呼叫某個函式時m_i,無論CMyClass創建了多少個類的物件,所有物件的值都應該設定為零?
#include <iostream>
using namespace std;
class CMyClass {
public:
static int m_i;
};
int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;
int main() {
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject1.m_i = 1; // set m_i to 1 for first object
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject2.m_i = 2; // set m_i to 2 for second object
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
CMyClass::m_i = 0; // set m_i to zero for all objects
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
}
Output
0
0
1
1
2
2
0
0
預期輸出應該是:
Output
0
0
1
0
1
2
0
0
UPD MCU 使用的解決方案由@Lasersk?ld 提出,無需任何額外的庫即可作業:
#include <iostream>
using namespace std;
class CMyClass {
public:
// The member variable should not be static because
// it is unique for each class instance.
int m_i;
};
CMyClass instances[2];
void resetInstances() {
for (auto &instance: instances) {
instance.m_i = 0;
}
}
int main() {
cout << instances[0].m_i << endl;
cout << instances[1].m_i << endl;
instances[0].m_i = 1;
cout << instances[0].m_i << endl;
cout << instances[1].m_i << endl;
instances[1].m_i = 2;
cout << instances[0].m_i << endl;
cout << instances[1].m_i << endl;
resetInstances();
cout << instances[0].m_i << endl;
cout << instances[1].m_i << endl;
}
輸出:
0
1
0
1
2
0
0
uj5u.com熱心網友回復:
將每個實體保存在靜態串列中,如下所示:
#include <iostream>
#include <vector>
using namespace std;
class CMyClass {
public:
CMyClass(int i): m_i{i} {
instances.push_back(this);
}
// ~CMyClass() {
// ... handle removal if nessesary. check out std::remove(...)
// }
int m_i = 0;
static std::vector<CMyClass*> instances;
static void reset() {
for (auto &instance: instances) {
instance->m_i = 0;
}
}
};
std::vector<CMyClass*> CMyClass::instances;
int main() {
CMyClass myObject1{0};
CMyClass myObject2{0};
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject1.m_i = 1;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
myObject2.m_i = 2;
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
CMyClass::reset();
cout << myObject1.m_i << endl;
cout << myObject2.m_i << endl;
}
可能的微控制器(無堆)實作。
#include <iostream>
#include <array>
using namespace std;
class CMyClass {
public:
// The member variable should not be static because
// it is unique for each class instance.
int m_i = 0;
};
// If you use microcontrollers that does not implement the standar library
// replace this with
// CMyClass instances[2];
std::array<CMyClass, 2> instances;
void resetInstances() {
for (auto &instance: instances) {
instance.m_i = 0;
}
}
int main() {
cout << instances.at(0).m_i << endl;
cout << instances.at(1).m_i << endl;
instances.at(0).m_i = 1;
cout << instances.at(0).m_i << endl;
cout << instances.at(1).m_i << endl;
instances.at(1).m_i = 2;
cout << instances.at(0).m_i << endl;
cout << instances.at(1).m_i << endl;
resetInstances();
cout << instances.at(0).m_i << endl;
cout << instances.at(1).m_i << endl;
}
注意:我不建議m_對公共類成員使用名稱約定。在這種情況下,我會m_i簡單地呼叫成員變數i,然后使用m_...僅在類的私有函式中使用的私有變數。
uj5u.com熱心網友回復:
您的要求:
如何使變數 m_i 對每個物件都有自己的值,并且在呼叫某個函式時,無論創建了多少類 CMyClass 的物件,所有物件的 m_i 值都應設定為零
這是兩個不能輕易滿足的要求:
- 如果
int m_i是靜態成員,它將在所有實體之間“共享”(未滿足要求 1)。 - 如果
int m_i是非靜態成員,則每個物件都可以有自己的值。但是一個方法不能簡單地為所有實體設定它(不滿足要求 2)。
解決方案:
保留實體的靜態陣列。您的ctor應將物件添加到此陣列中,而dtor應將其洗掉。因此,每個物件都可以有自己的值m_i,但是特定的方法可以遍歷所述陣列并為所有實體設定它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/532192.html
標籤:C 班级目的哎呀
上一篇:lua類建構式中的本地物件?
下一篇:SerializeField/Serializable不適用于自定義類串列(List<customClass>)
