2016-12-22 16 views
-1

Hire.hで私は2つのtypedefを宣言しました。 Customer.hで私はこのtypedefを使用することができます。それを修正するには?。別のクラスエラー:型が宣言されていません

#pragma once 
#include "typedefs.h" 
#include "Vehicle.h" 
#include "Customer.h" 
namespace rent { 

typedef std::shared_ptr<Hire> shared_Hire_t; 
typedef std::map<uuid_t, shared_Hire_t> mapHirePtr_t; 

    class Hire 
    { 

    public: 
    Hire(date_t start_date, Vehicle *vehicle, Customer *customer); 
    virtual ~Hire();          

    private: 
    uuid_t uuid; 
    date_t start_date; 
    date_t end_date; 
    uint_t hire_days; 
    double day_price; 
    double cost; 
    Vehicle *vehicle; 
    Customer *customer; 

    }; 
    } 

-

#pragma once 
#include <iostream> 
#include <map> 
#include <memory> 
#include "typedefs.h" //uint_t, uuid_t 
#include "CustomerType.h" 

namespace rent { 

class Hire; 

class Customer 
{ 
public: 
enum EnumCustomerType {standard, medium, premium}; //to set a CustomerType 
Customer(std::string name, std::string surname, std::string pesel, double balance = 0.0, EnumCustomerType enum_customer_type = standard); 
virtual ~Customer(); 

void add_hire(shared_Hire_t hire); 
void end_hire(shared_Hire_t hire); 

protected: 

std::string name; 
std::string surname; 
std::string pesel; 
double balance; 
EnumCustomerType enum_customer_type; 
double discount; 

mapHirePtr_t current_hires; 
uint_t hires_count; 

private: 

std::unique_ptr<CustomerType> customer_type; 

}; 
} 

-

Customer.h:31:17: error: 'shared_Hire_t' has not been declared void add_hire(shared_Hire_t hire); ^Customer.h:32:31: error: 'shared_Hire_t' has not been declared void end_hire(shared_Hire_t hire); ^Customer.h:42:3: error: 'mapHirePtr_t' does not name a type mapHirePtr_t current_hires;
^Customer.cpp:87:14: error: prototype for 'void rent::Customer::add_hire(rent::shared_Hire_t)' does not match any in class 'rent::Customer' void Customer::add_hire(shared_Hire_t hire) ^In file included from Customer.cpp:1:0: Customer.h:31:8: error: candidate is: void rent::Customer::add_hire(int) void add_hire(shared_Hire_t hire); ^Customer.cpp:94:14: error: prototype for 'void rent::Customer::end_hire(rent::shared_Hire_t)' does not match any in class 'rent::Customer' void Customer::end_hire(shared_Hire_t hire) ^Customer.cpp:1:0: Customer.h:32:22: error: candidate is: void rent::Customer::end_hire(int) void end_hire(shared_Hire_t hire);

PS。どのようにstackoverflowで適切な方法でコードの2つのブロックを分離するには?

+0

私は、そのコードのすべてではないが、エラーを再現することが適切であるかなり確信しています。 [MCVE]を提供してください。 –

答えて

0

typewefを表示するには、Hare.hをCustomer.hにインクルードする必要があります。 それは循環参照を導入するので、私はtypedefを別々のファイルに入れることを提案します。

+0

それでは、HireTypedef.hをクラスHireに関連したストーリーのみのtypedefにすることをお勧めしますか?それは賢明な解決策ですか? – Felipe

+0

また、typedefをCustomer.hに追加するか、Hire.hをCustomer.hに含めることもできます。その場合は、Customer *のみを使用しているため、Hire.hからのCustomer.hのインクルードを削除する必要があります。クラスCustomer *に置き換えたり、上部に前方宣言を追加したりすることができます。 – ACB

0

ここで定義を利用できるようにするには、Customer.hの#include "Hire.hが必要です。

残念ながら、これはヘッダー間の循環依存関係を作成します。

幸いにも、Hire.hはCustomerVehicleの定義を必要としないので、それらを含めるのをやめてクラスをフォワード宣言することができます。

Hire.h:

#include "typedefs.h" 
namespace rent { 

class Vehicle; 
class Customer; 
class Hire; 

typedef std::shared_ptr<Hire> shared_Hire_t; 
typedef std::map<uuid_t, shared_Hire_t> mapHirePtr_t; 

class Hire 
{ 


// ... 

Customer.h:

#include <iostream> 
#include <map> 
#include <memory> 
#include "typedefs.h" //uint_t, uuid_t 
#include "CustomerType.h" 
#include "Hire.h" 

namespace rent { 

class Customer 
{ 
// ... 
関連する問題