由于循环包含,Visual C ++构建错误

时间:2016-06-09 16:33:17

标签: c++ visual-studio

我有两个相互使用的类作为成员.. 第一类:

#ifndef PROPERTY_H

#define PROPERTY_H
#include "individualProperty.h"
#include "structurizer.h"
#include "p_owner.h"
#include <windows.h>
class p_owner;
class p_property {

private:
    p_owner _Owner;
    string ownerName;
    string propertyAddress;
    string taxID;
    string postalCode;
    bool owes_taxes;
    double propertyTaxVal;
    double solidWasteTaxVal;
public:
    p_owner getOwner() { 
        return _Owner;
    }
    void setOwner(p_owner a) { _Owner = a; }

    string getPropertyAddress() { return propertyAddress; }
    void setPropertyAddress(string a) { propertyAddress = a; }

    void setTaxID(string a) { taxID = a; }
    string getTaxID() { return taxID; }

    void setPostalCode(string a) { postalCode = a; }
    string getPostalCode() { return postalCode; }

    void setTaxes(bool a) { owes_taxes = a; }
    bool getTaxes() { return owes_taxes; }

    void setPropertyTaxVal(double a) { propertyTaxVal = a; }
    double getPropertyTaxVal() { return propertyTaxVal; }

    void setSolidWasteTaxVal(double a) { solidWasteTaxVal = a; }
    double getSolidWasteTaxVal() { return solidWasteTaxVal; }

    p_property(string _taxID)
    {
        taxID = _taxID;
    }





};

#endif

第二类:

#ifndef OWNER_H
#define OWNER_H
#include "individualProperty.h"
//#include <vector>
#include "property.h"
class p_property;
class p_owner
{

private:
    string ownerName;
    string mailingAddress;
    string mailingState;
    vector<p_property> ownedProperties;
    int numProperties;


public:

    string getOwnerName() { return ownerName; }
    void setOwnerName(string a) { ownerName = a; }
    string getMailingAddress() { return mailingAddress; }
    void setMailingAddress(string a) { mailingAddress = a; }
    string getMailingState() { return mailingState; }
    void setMailingState(string a) { mailingState = a; }

    p_property getPropertyAtIndex(int a) { 
        return ownedProperties.at(a);
    }
    void addProperty(p_property a) {
        ownedProperties.push_back(a);
        numProperties++;
    }
    int getNumProperties() { return numProperties; }


    p_owner(string _name, string _addy, string _state)
    {
        setOwnerName(_name);
        setMailingAddress(_addy);
        setMailingState(_state);
        numProperties = 0;
    }

    p_owner()
    {
        setOwnerName("null");
        numProperties = 0;
    }




};

#endif

建成后我收到错误: Error Image

这很奇怪,因为这个解决方案昨天完美无缺!有没有人对这个问题的根源有任何见解?

2 个答案:

答案 0 :(得分:0)

class p_owner;
class p_property {
    p_owner _Owner;
    ...
}

这不起作用,因为尚未定义p_owner。您可以做的是声明一个p_owner指针。例如:

class p_owner;
class p_property {
    p_owner *ptr_owner;
    ...
}

然后使用指针来解决你的get / set问题

p_owner* getOwner() { return ptr_owner; }
void setOwner(p_owner* a) { ptr_owner = a; }

答案 1 :(得分:0)

请勿在{{1​​}}中加入property.h。只转发声明owner.h(正如您已经做过的那样)。现在将所有引用p_property或其成员的方法 body 从所有者的标题移动到所有者的cpp文件。这将打破依赖关系。

我认为您还必须将构造函数/析构函数decls添加到p_property的decl中,并在p_owner中提供实体(即使为空)。

目标是在您编译owner.cpp的正文之前,不要强制vector<p_property>字段实例化任何std::vector<p_property>方法。编译器生成的构造函数/析构函数将导致向量由头文件实例化。

目前尚不清楚这是你真正想要的东西!p_owner 直接包含一个p_property,以及p_owner包含直接包含 p_owner的向量 - 您 获取您可能想要的图形结构!您最有可能希望p_property指针添加到p_property。您可能还希望p_owner拥有指向 p_owner的指针的向量。但前面的段落回答了您提出的问题,只有您可以确定它是否是正确的问题。