我试图实现规范pattern.In --我有一个规范抽象类和一个重载&操作符,它返回AndSpecification,它实际上是从class.Now派生的--存在循环依赖关系b/w AndSpecification的问题,Specification.Specification是类模板,AndSpecification也是。
Specification.h
//#include "AndSpecification.h"- this creates a problem
template <class T>
class Specification
{
public:
Specification()
{
}
virtual ~Specification()
{
}
virtual bool isSatisfied(T *item)=0;
AndSpecification<T> operator&&(Specification &other)
{
return AndSpecification<T>(*this,other);
}
};AndSpecification.h
#include "Specification.h"
template <class T>
class AndSpecification : public Specification<T>
{
Specification <T> *first;
Specification <T> *second;
public:
AndSpecification(Specification <T> *first,Specification <T> * second);
// Specification interface
public:
bool isSatisfied(T *item) override;
};如能提供帮助,将不胜感激。完整代码:https://github.com/princekm/specification.git
发布于 2021-04-28 10:30:09
您需要前向声明,并移动方法的定义,这两个类定义都需要在这些类之后:
// Specification.h
#pragma once
template <class T> class AndSpecification;
template <class T>
class Specification
{
public:
Specification() {}
virtual ~Specification() {}
virtual bool isSatisfied(T *item)=0;
AndSpecification<T> operator&&(Specification &other);
};
#include "Specification.inl"// AndSpecification.h
#pragma once
#include "Specification.h"
template <class T>
class AndSpecification : public Specification<T>
{
Specification <T> *first;
Specification <T> *second;
public:
AndSpecification(Specification <T> *first,Specification <T> * second);
// Specification interface
public:
bool isSatisfied(T *item) override;
};// Specification.inl
#pragma once
#include "Specification.h"
#include "AndSpecification.h"
template <class T>
AndSpecification<T> Specification<T>::operator&&(Specification &other)
{
return AndSpecification<T>(this, &other);
}发布于 2021-04-28 10:29:04
向前声明:
template <class T> AndSpecification;以下内容是正确的(通过删除示例中的纯虚拟方法):
template <class T> class AndSpecification;
template <class T>
class Specification
{
public:
Specification()
{
}
virtual ~Specification()
{
}
// virtual bool isSatisfied(T *item)=0;
AndSpecification<T> operator&&(Specification &other)
{
return AndSpecification<T>(*this,other);
}
};
template <class T>
class AndSpecification : public Specification<T>
{
Specification <T> *first;
Specification <T> *second;
public:
AndSpecification(Specification <T> *first,Specification <T> * second);
// Specification interface
public:
bool isSatisfied(T *item) override;
};
class A{};
int main() {
Specification<A> a;
}发布于 2021-04-28 10:31:51
与前向声明(请参阅其他答案)不同,您可以考虑Specification不一定需要了解AndSpecification。我是说,反正这是个模板。如果向Specifiacation添加模板模板参数,如下所示:
template <class T,template<typename> class X>
class Specification
{
public:
Specification()
{
}
virtual ~Specification()
{
}
virtual bool isSatisfied(T *item)=0;
X<T> operator&&(Specification &other)
{
return X<T>(*this,other);
}
};然后,只有当您实例化它时,您才需要知道这两者:
#include "Specification.h"
#incldue "AndSpecification.h"
template <typename T>
using Specification_with_And = Specification<T,AndSpecification>;https://stackoverflow.com/questions/67298139
复制相似问题