将一个类的对象声明为另一个类的成员(C++)

将一个类的对象声明为另一个类的成员(C++),c++,class,c++11,object,member,C++,Class,C++11,Object,Member,由于某些原因,我的编译器不允许我使用另一个类的对象作为另一个类的成员。这是我的密码: 在参数h中: class Parameter { private: string type; string name; public: Parameter() {}; string toString(); friend class Predicate; }; 然后,在谓词.h中: #incl

由于某些原因,我的编译器不允许我使用另一个类的对象作为另一个类的成员。这是我的密码:

在参数h中:

class Parameter {
     private:
          string type;
          string name;
     public:
          Parameter() {};
          string toString();
          friend class Predicate;
};
然后,在谓词.h中:

#include "Parameter.h"
class Predicate {
     private:
          Parameter lParam;
          Parameter rParam;
          string type;
     public:
          Predicate() {};
          string toString();
          friend class Parameter;
};

当我尝试编译时,我会收到错误,说Predicate.h中的参数没有命名类型,并且它没有在该范围内声明。我试着将成员分为私有和公共两种形式,并将friend类分为私有和公共两种形式。我还尝试使用指向对象的指针。我做错了什么?谢谢。

由于您描述的错误,虽然您尚未提供以下信息:

错误:“参数”未命名类型

您似乎遇到了Parameter.h和Predicate.h之间的“循环包含”,如注释中所示

当您声明两个都知道另一个参数和谓词的类时,就会发生这种情况。考虑谓词。在谓词声明时,编译器需要已经知道参数的存在,因为它在谓词中显示为成员

解决方案的第一次尝试是包含Parameter.h,它提供了参数的声明。但是,参数要求谓词已经声明,以使其成为友元类。这是一个循环依赖项

解决这个问题的推荐方法是使用所谓的

因此,这允许我们在不需要包含整个Predicate.h文件的情况下完成参数声明。另一方面,谓词.h可以继续包含参数.h而不会出现问题,因为循环依赖关系已被打破

请注意,如果从标头中的参数调用任何谓词的方法,则转发声明将不起作用。这是因为调用任何方法都需要完整的类声明。您可以通过在源文件中实现参数的方法来解决这个问题


更多一般性讨论,请参见此。

您是否正在更改使用名称空间std;在某个地方而不是另一个地方?停止使用那个anyplace,将字符串限定为:std::string,看看这是否能修复它。我的猜测是,您有循环包含。如果没有我的猜测,很难确定参数.h只有在前面加上include并使用名称空间std或可能使用std::string时才起作用。头文件需要是自包含的,并且在大多数情况下也避免在这样的上下文中使用。换句话说,包括在Parameter.h中,不要在其中使用名称空间std,而是使用std::string来引用所有头中的字符串。然而,这只是一个猜测,因为您还没有提供一个示例,也没有费心描述编译器正在生成什么诊断。
// Parameter.h
#pragma once                                         
#include <string>                                    

class Predicate;  // Forward declare Predicate

class Parameter {                                    
private:                                             
    std::string type;                                
    std::string name;                                
public:                                              
    Parameter() {};                                  
    std::string toString() { return "Parameter"; };  
    friend class Predicate;                          
};