2016-08-22 2 views
1

모든 개체에 대한 참조 목록을 유지해야하는 클래스가 있습니다. 예를 들어 : mapAmain.cpp 글로벌에만 있기 때문에동일한 클래스에서 사용하는 클래스 참조 클래스

//A.cpp 
class A { 
    A() {} 
    someMethod() {} 
    someOtherMethod() { mapA[0]->someMethod(); } 
} 

//main.cpp 
#include <map> 

std::map<int, A*> mapA; 
int main(int argc, char const *argv[]) { 
    int count = 0; 
    A* a = new A(); 
    mapA[count] = a; 
    count++; 
} 

그러나, A.cpp 그것을 참조 할 수 없습니다. 내가 extern을 사용하여 시도했지만 map이 같은 클래스 A을 사용하기 때문에 어디에 넣어야할지 모르겠다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

+0

는 결함이 디자인처럼 조금 보이는. 첫째로, 왜 당신은 1 위의 맵에 저장된 미가공 포인터를 사용하고 있습니까? 실제 요구 사항에 대해 설명하고 사례를 조금 더 사용 하시겠습니까? 해결하려고하는 XY 문제와 약간의 소리가납니다. –

+0

@ πάνταῥεῖ 나는'deposit()'과'withdraw()'메소드를 사용하여 은행 시스템을 작성하고있다. 그러나 나는 또한 어떤 은행의 계좌간에 돈을 이체하는'transfer()'를 가지고있다. 그래서 은행이 모든 기존 은행을 추적하기를 바랍니다. ABA와 같은 것. – drum

+0

이 'transfer()'작업을 수행 할 수있는 인터페이스를 제공하는 모든 계정에 대해 상위 컨테이너 컨테이너 클래스를 갖는 것은 어떻습니까? 아마도 그런 종류의 비즈니스 논리를 외부화해야합니다. 또한 원시 포인터를 다루지 말고 대신 [스마트 포인터] (http://en.cppreference.com/w/cpp/memory)를 가져야합니다. –

답변

1

당신은 생성자에서이를 등록하고, 클래스의 정적 VAR을 만들 수 있습니다

// a.hpp 
class A { 
public: 
    A() { as.insert(this); } 
    A(const A& rhs) { as.insert(this); } 
    ~A() { as.erase(this); } 
    static std::set<A*> as; // Declaration 
}; 

// a.cpp 
std::set<A*> A::as; // Definition 
+0

흠, 그게 기본 문제를 해결하지만, 이것은 정말로 해결할 문제입니까? –

+0

나는 BTW하지 않았다! 그냥 반대표를 던졌습니다. –

+0

@ πάνταῥεῖ : 컬렉션에 모든 인스턴스를 유지하는 몇 가지 유효한 사례가 있다고 생각할 수 있습니다. 그것은 OP의 경우가 아닌 것 같습니다 ... – Jarod42

관련 문제