我有一個類有一個std :: vector成員用於存儲外部類的對象。C++ - 通過成員函數更改一個類的成員值
class Example {
private:
std::vector<OtherClass> list_of_things_;
}
class OtherClass {
public:
void ChangeName(std::string name);
private:
std::string name_;
}
通過我的代碼,我想改變一些存儲在此list_of_things_的OtherClass的對象,所以我用我的例子類兩種功能:
std::vector<OtherClass> RetrieveObjects() {
std::vector<OtherClass> result;
std::vector<OtherClass>::iterator it;
for (it = list_of_things_.begin(); it != list_of_things_.end(); ++it) {
if (some condition is met) {
result.push_back(*it);
}
}
}
然後在實例中其他功能我打電話這個喜歡:現在
std::vector<OtherClass> objs = RetrieveObjects();
std::vector<OtherClass>::iterator it;
for (it = objs.begin(); it != objs.end(); ++it) {
it->ChangeName("new name");
}
,這是原則上的工作,但只有當我從OBJ文件變量檢查名字,這並沒有改變內部list_of_things_的對象是我的主要意圖。
我真的做了一個對象的副本,而不是檢索list_of_things_中的相同對象嗎?如果是這樣,爲什麼?我犯了一些其他錯誤嗎?我應該使用指針嗎?我是C++新手,仍然在尋找解決方法。
在這裏你可以找到一個運行測試代碼:
#include <vector>
#include <string>
#include <iostream>
class OtherClass {
public:
OtherClass(std::string s) : name_(s) {}
std::string GetName();
void ChangeName(std::string name);
private:
std::string name_;
};
std::string OtherClass::GetName() {
return name_;
}
void OtherClass::ChangeName(std::string name) {
name_ = name;
}
class Example {
public:
Example(std::vector<OtherClass> l) : list_of_things_(l) {}
void ChangeNames();
void WriteNames();
protected:
std::vector<OtherClass> RetrieveObjects();
private:
std::vector<OtherClass> list_of_things_;
};
std::vector<OtherClass> Example::RetrieveObjects() {
std::vector<OtherClass> result;
std::vector<OtherClass>::iterator it;
for (it = list_of_things_.begin(); it != list_of_things_.end(); ++it) {
if (it->GetName() == "Name") {
result.push_back(*it);
}
}
return result;
}
void Example::ChangeNames() {
std::vector<OtherClass> objs = RetrieveObjects();
std::vector<OtherClass>::iterator it;
for (it = objs.begin(); it != objs.end(); ++it) {
it->ChangeName("new name");
std::cout << it->GetName() << std::endl;
}
}
void Example::WriteNames() {
std::vector<OtherClass>::iterator it;
for (it = list_of_things_.begin(); it != list_of_things_.end(); ++it) {
std::cout << it->GetName() << std::endl;
}
}
int main() {
OtherClass oc = OtherClass("Name");
OtherClass oc2 = OtherClass("None");
OtherClass oc3 = OtherClass("Name");
std::vector<OtherClass> v = {oc, oc2, oc3};
Example ex = Example(v);
ex.ChangeNames();
ex.WriteNames();
}
謝謝!
謝謝你的解釋! 如果我想要一個引用向量,我應該使用: std :: vector 與'&'裏面? –
EDL
@EDL引用的向量並不真的工作得很好,因爲引用是不可變的。在這種情況下,您最好使用指針向量:'std :: vector'。儘管指針在語法上比句柄要複雜得多,所以如果你不熟悉它們,你可能需要先做一些閱讀。 –
ComicSansMS