0

I try to write program to manage Store. it has some users and goods and Order. this is my User.h, Good.h files:

User.h:

#ifndef _USER
#define _USER

#include "Store.h"
#include "Good.h"

namespace question1
{
    class User
    {
        const Store store;
    public:
        User(Store &s) : store ( s )
        {
        }
    };

    class AdminUser:User
    {
    };

    class DeliveryUser:User
    {
    };

    class OrderUser:User
    {
        void registerOrder(Order &o);
    };

    class ReceptionUser:User
    {
        void importGood(Good &g);
        void increaseGood(Good &g);
    };
}

#endif

and Good.h:

#ifndef _GOOD
#define _GOOD

#include <string>
#include <vector>
#include "User.h"

namespace question1
{
                                                    class Date
{
 public:
    Date ();
    Date ( int mn, int day, int yr);  // constructor
    void display();                   // function to display date
    int GetMonth();
    void SetMonth(int mn);
    ~Date();
 private:
    int month, day, year;
    int DaysSoFar();
};

    enum Ordertype{Newly_registered, Check, Answered};

    class Order
    {
        int num;
        std::string customerName;
        Date registered, Check;
        Ordertype type;
        std::vector<int> codelist, numlist;
    public:
        Order();
        Order(Order& o);
    };

                        class ImportDate
{
    Date importDate;
    User importer;
    int num;
};

                            class ExportDate
{
    Date exportDate;
    User exporter;
    int num;
    Order ex;
};

    class Good
    {
        std::string name;
        int code;
        Date in;
        int innum, AvailableNum;
        User importer;
        std::vector<ImportDate> importHistory;
        std::vector<ExportDate> exportHistory;
    public:
        Good();
        Good(Good &g);
    };

                int max (int a, int b)
{
   if (a>b) return(a) ; else return (b);
}

                int min (int a, int b)
{
   if (a>b) return(b); else return (a);
}
}

#endif

but when compile just this two codes, i got error in User File that

"syntax error : identifier 'Order', Line 28

"syntax error : identifier 'Good', Line 33

"syntax error : identifier 'Good', Line 34

in the function parameter list. I use visual studio 2010. and open empty project.

anybody can help me?

4

2 回答 2

2

你有一个循环引用。简而言之,你最终会得到这样的结果:

class Good
{
    User * fn() {} // What is a User?
};

class User
{
    Good * fn() {}
};

C++ 的行为不像 C# 并且自上而下地读取文件,因此当它遇到对 User 的第一个引用时,它还不知道它是什么。即使你切换类的顺序,问题也会回来。

您可能应该将它们放在同一个文件中并使用类型转发:

class User;

class Good
{
    User * fn() {} // Ah, User is some class. Go on.
};

class User
{
    Good * fn() {}
};

或者(正如 Agentlien 建议的那样):

class User;

class Good
{
    User fn();
};

class User
{
    Good fn();
};

User Good::fn() { return User(); }

Good User::fn() { return Good(); }
于 2013-04-17T05:19:19.950 回答
0

这里的问题是,编译器第一次到达类或函数的定义时,它使用的所有类型都需要声明。因此,例如,具有:

void importGood(Good &g);

User.h中,意味着Good必须在此函数声明之前声明。这最好使用前向声明来完成,它简单地写成一行,例如:

class Good;

这需要放在使用这种类型的任何函数的声明之前,因为否则编译器不知道它是一个类型的名称,你会得到编译器错误。

通常,也可以简单地#include定义此类型的文件。但是,这种方法有两个缺点:

  1. 它要贵得多。即使您使用包含保护,系统仍然必须读取并标记文件,然后才能确定您对其内容不感兴趣。

  2. 每当您有循环依赖时,例如您的情况,它都无济于事。编译器将简单地开始编译,例如User.cpp。然后它将包含User.h,并且几乎会立即遇到#include "Good.h". 从那时起,它将进入Good.h。在那里,您(再次)尝试#include User.h,由于包含保护,这将在很大程度上被忽略。因此,一旦UserGood.h中出现任何使用,编译器仍然没有看到它的声明。

前向声明通过在第一次使用之前将类的声明直接放在使用它的文件中来解决这个问题。

通常,您应该更喜欢在头文件中使用前向声明,并避免包含其他头文件。只要有可能。

您真正需要直接从头文件中包含某些内容的唯一时间是当您创建在该头文件中声明的类型的实例时(例如,通过将其作为不是指针或引用的成员变量)或当您'在标题中使用该类的成员(例如函数或成员变量)。这就是为什么将函数定义放在 cpp 文件中而不是头文件中总是一个好主意的原因之一。

于 2013-04-17T06:29:54.803 回答