2014-04-28 2 views
1

나는이 두 클래스가 서로 필요하고 같은 클래스에서 상속 받았다. Wehn 나는 Seller.h 컴파일, 괜찮아요 컴파일하지만 내가 Buyer.h 컴파일하면 Seller.h에서 오류가 발생합니다.클래스는 선언되지 않았지만 포함 되었습니까?

Seller.h:14:16: error: âBuyerâ has not been declared 

    void addBuyer(Buyer*); 

       ^
Seller.h:15:14: error: âBuyerâ was not declared in this scope 
    std::vector<Buyer*> getBuyers() const; 

Seller.h:20:17: error: âOrderâ has not been declared 
    void fillOrder(Order*); 
      ^

그들은 #include하는되지만 여전히 범위를 벗어나 말한다 : 내가 Buyer.h를 컴파일 할 때

그래서 나는 다음과 같은 오류를 얻을. Buyer.h

#ifndef BUYER_H 
#define BUYER_H 
#include <string> 
#include "Entity.h" 
#include <queue> 
#include "Order.h" 
#include "Seller.h" 
class Buyer : public virtual Entity 
{ 
public: 
     Buyer(const std::string &, const std::string &, double =0.0); 
     virtual ~Buyer(){} 
     void addSeller(Seller *); 
     std::queue <Seller *> getSellers() const; 
     void addOrder(Order *); 
     std::queue <Order*> getOrders() const; 
     virtual void list() const override; 
     virtual void step() override; 

private: 
     std::queue <Order*> orders; 
     std::queue <Seller*> sellers; 
}; 
#endif 
+4

순환 포함 종속성이 있습니다. 그건 안돼. http://stackoverflow.com/questions/625799/resolve-circular-dependencies-in-c – juanchopanza

+0

을 참조하십시오. 그러나 Order 클래스는 어떻습니까? 그것은 실제로 주기적이 아니며 오류도 발생합니다. – user3582405

답변

1

#ifndef SELLER_H 
#define SELLER_H 
#include "Entity.h" 
#include <string> 
#include <vector> 
#include "Inventory.h" 
#include "Buyer.h" 
#include "Order.h" 
class Seller : public virtual Entity 
{ 
public: 
     Seller(const std::string &, const std::string &, double=0.0); 
     virtual~Seller(){} 
     void addBuyer(Buyer*); 
     std::vector<Buyer*> getBuyers() const; 
     void setInventory(Inventory*); 
     Inventory* getInventory() const; 
     virtual void list() const override; 
     virtual void step() override; 
     void fillOrder(Order*); 
private: 
     Inventory* inv; 
     std::vector <Buyer*> buyers; 
}; 
#endif 

당신은 SellerBuyer 사이에 순환 종속성이. 이것은 컴파일러가 을 컴파일하기 위해 Seller의 선언을 요구하기 때문에 결코 작동하지 않을 것입니다 ... 아직 Seller을 컴파일하려면 의 선언이 필요합니다.

실제로 사용하는 것은이 유형에 대한 포인터이기 때문에 클래스를 전달할 수 있습니다. 예를 들면 : 당신이 Seller의 구성원으로 Buyer의 인스턴스를 가지고 있다면 어떤 방법이 걸렸다 경우 (즉, Buyer _buyer;) 또는/Buyer의 인스턴스를 반환

#ifndef SELLER_H 
#define SELLER_H 
#include "Entity.h" 
#include <string> 
#include <vector> 
#include "Inventory.h" 
#include "Order.h" 

// forward declaration of Buyer 
class Buyer; 

class Seller : public virtual Entity 
{ 
public: 
     Seller(const std::string &, const std::string &, double=0.0); 
     virtual ~Seller(){} 
     void addBuyer(Buyer*); 
     std::vector<Buyer*> getBuyers() const; 
     void setInventory(Inventory*); 
     Inventory* getInventory() const; 
     virtual void list() const override; 
     virtual void step() override; 
     void fillOrder(Order*); 
private: 
     Inventory* inv; 
     std::vector <Buyer*> buyers; 
}; 
#endif 

, 당신은 당신의 구조를 변경해야 할 것입니다. 당신이 그 문제를 가지고 있지 않기 때문에, 앞으로 선언은 충분할 것이다. 하나는 많은 벌거 벗은 포인터는 C++ 프로그램에서 사용되는 볼 때


여담으로

, 나는이 프로그램의 구조에 관여하지 오전 인정, 그것은 일반적으로 나쁜 징조입니다. 인스턴스를 저장할 수 있습니다. 소유권 의미에 따라 안전 포인터 (shared_ptrunique_ptr)를 사용할 수 있습니다.

예를 들어, addBuyer은 쉽게 포인터 대신 Buyer&을 사용할 수 있습니다. 이제 잘못된 포인터에 대해 걱정할 필요가 없습니다. 나는 당신이 당신의 buyers vector에 이것들을 추가한다고 가정하고 있습니다 ... 그러나이 포인터들이 Seller 인스턴스의 유효 기간 동안 유효하다는 것을 어떻게 보장합니까? 당신은 할 수 없습니다; 너는 addBuyer이라고하는 자비에있어.

std::vector<Buyer>을 저장하고 add 메소드에서 참조를 가져 오지 않는 이유는 무엇입니까? 복사본의 비용이이 디자인을 보증 할만큼 엄청나게 높습니까? 그렇다면 shared_ptr을 사용할 수 없습니까?

+0

이것은 프로젝트를위한 것이므로 포인터 등을 사용하는 것과 같은 몇 가지 지침이 주어졌습니다. – user3582405

+0

Order 클래스에 대한 질문이 있습니다. 나의 판매자 클래스도 나에게 그것에 대한 오류를 준다. 왜 범위를 벗어 났습니까? 나는 그것을 포함 시켰습니다 – user3582405

+0

@ user3582405 : 글쎄, 당신은'Order' 선언을 게시해야하지만 같은 문제 일 수 있습니까? 'Order'는'Seller'를 사용합니까? –

관련 문제