나는이 class
멤버가있는을 vector<class B>
. 나는 이것을 A vector
외부 class
에서 깨끗한 방식 으로 반복하고 싶습니다 . 공개 기능을 사용하여 B에 대한 작업을 수행해야합니다.
이를 위해 int get_next_element(B * in_B)
다음 요소를 올바르게로드했으면 0을 반환하고 그렇지 않으면 -1을 반환 할 수 있는 함수가 있다고 생각했습니다 .
나는를 사용하여 이것을 생각 iterator
했지만 이것으로 두 가지 문제를 발견했습니다. 우선, iterator
를 a 로 변환하는 깔끔한 방법을 찾을 수 없었 습니다 pointer
( 를 a iterator
와 같이 사용할 수있는 것 같지만 이것이 pointer
좋은 솔루션인지 확실하지 않습니다). 둘째, my iterator
에서 참조하는 값이 있는지 확인 해야합니다. "null 반복자"에 가장 가까운 것이 .end()
요소 이기 때문에 어떻게 초기화할지 알 수 없습니다. 초기화 (비어 있음)하고 .end()
참조가 있으면 무언가를 추가하면 비교할만한 것을 참조하지 않습니다.
내가 int
어떤 요소에 있는지 추적 하는 추가 기능 을 가질 수 있지만 int
요소를 추가 할 때마다 관리해야합니다 .
반복 코드를 class
A 외부에 배치하는 것을 고려 했지만 루프 중에 개별 요소를 변경하거나 액세스해야 할 수 있으므로 복잡하고 큰 반복 블록을 만들 수 있습니다.
이 문제를 어떻게 깔끔하게 (예 :) 해결할 수 int get_next_element(B * in_b)
있습니까?
편집 : 여기에 몇 가지 코드가 있습니다 : 헤더 :
class B {
public:
B();
void set_size(int in_size);
int get_size();
protected:
int mSize;
};
class A {
public:
A();
void add_B(B in_B);
int get_next_element(B * in_B);
protected:
std::vector<B> mObjects;
};
cpp 파일 :
B::B() {
// Stuff
}
void B::set_size(int in_size) {
mSize = in_size;
}
int B::get_size() {
return mSize;
}
A::A() {
// Stuff
}
void A::add_B(B in_B) {
mObjects.push_back(in_B);
}
int A::get_next_element(B * in_B) {
// ToDo : handle elements
}
그리고 주요 :
int main() {
A test_a;
for (int i = 0; i < 5; i++) {
B tmp_b;
tmp_b.set_size(i);
test_a.add_B(tmp_b);
}
B iterator_b;
while (0 == get_next_element(& iterator_b)) {
if (iterator_b.get_size > 2) {
B tmp_b;
tmp_b.set_size(iterator_b.get_size - 2);
test_a.add_B(tmp_b);
iterator_b.set_size(2);
}
}
}
따라서 기본적으로 A
많은 B
s를 보유하고 메인이 그들을 통해 반복하고 (이 예에서는) main
. 이 작업이 수행되는 몇 가지 차원 / 방법이 있습니다. 이것이 부분적으로 .NET의 코드만큼 "숨기기"를 원하는 이유입니다 A
.
(이것은 Bs가 내부 관계를 가져야 할 수도 있지만 기본적으로 아이디어입니다)
이것이 제가 의미하는 바입니다 ...
#include <iostream>
#include <vector>
class B {
public:
B(int in) :mSize(in) {}
size_t mSize;
void set_size(int in_size) { mSize = in_size;}
int get_size() {return mSize;}
};
class A {
using container = std::vector<B>;
using iterator = container::iterator;
container mObjects;
public:
void add_B(B in_B) { mObjects.push_back(in_B); }
iterator begin() { return mObjects.begin(); }
iterator end() { return mObjects.end(); }
};
int main() {
A test_a;
for (int i = 0; i < 5; i++) {
test_a.add_B(B(i));
}
for( auto& item : test_a)
if (item.get_size() > 2) {
B tmp_b(item.get_size() - 2);
item.set_size(2);
test_a.add_B(tmp_b);
break;//if using a vector, must break as vector can change/reallocate on 'add_B()'
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다