C++;继承:作为成员变量的同一类的两个子类 C++继承与包含冲突 总结

C++;继承:作为成员变量的同一类的两个子类 C++继承与包含冲突 总结,c++,inheritance,include,C++,Inheritance,Include,在一个文件中,我包含了同一类的两个子类。由于每个子类都会导入基类的头文件,因此会导入它们的基类两次,并导致错误: build/classes/Market.h:8:7: error: redefinition of 'Market' class Market { ^ build/classes/Market.h:8:7: note: previous definition is here class Market { 类定义 我在Market.h中有一个基类,Market: cl

在一个文件中,我包含了同一类的两个子类。由于每个子类都会导入基类的头文件,因此会导入它们的基类两次,并导致错误:

build/classes/Market.h:8:7: error: redefinition of 'Market'
class Market {
      ^
build/classes/Market.h:8:7: note: previous definition is here
class Market {

类定义 我在
Market.h
中有一个基类,
Market

class Market {

public:
    // ...

private:
    // ...
};
#include "Market.h"

class CerealMarket: public Market {

public:
    // ...

private:
    // ...
};
#include "Market.h"

class CheeseMarket: public Market {

public:
    // ...

private:
    // ...
};
CerealMarket
CheeseMarket
是此类的子类:

CerealMarket.h
中:

class Market {

public:
    // ...

private:
    // ...
};
#include "Market.h"

class CerealMarket: public Market {

public:
    // ...

private:
    // ...
};
#include "Market.h"

class CheeseMarket: public Market {

public:
    // ...

private:
    // ...
};
奶酪市场.h
中:

class Market {

public:
    // ...

private:
    // ...
};
#include "Market.h"

class CerealMarket: public Market {

public:
    // ...

private:
    // ...
};
#include "Market.h"

class CheeseMarket: public Market {

public:
    // ...

private:
    // ...
};
最后,还有一个类
CommodityExchange
,它存储
CerealMarket
的一个实例和
CheeseMarket
的一个实例:

#include "CerealMarket.h"
#include "CheeseMarket.h"

class CommodityExchange {

public:
    // ...

private:
    const CheeseMarket cheeseMarket;
    const CerealMarket cerealMarket;
};
但是,这包括s
Market.h
两次。有没有可能拥有这种类继承结构,而不让编译器认为
市场
存在重复的定义

我正在使用以下命令进行构建:
g++-Wall-Werror-pedantic-O1 main.cpp CommodityExchange.cpp Market.cpp CerealMarket.cpp CheeseMarket.cpp

您需要配备防护装置:

#ifndef MARKET_H
#define MARKET_H

 // your code

#endif

这可以防止编译器包含两次一个文件。

在您的
市场.h
中,只需将
#pragma once
放在文件的最上面。 或者,您也可以使用防护装置:

#ifndef MARKET_H
#define MARKET_H

/* your class declaration */

#endif // MARKET_H
<>这是常见的做法,避免在C++中包含两个标题。