【发布时间】:2014-04-28 15:06:04
【问题描述】:
我遇到了循环依赖问题。基本上我有两个类,第一个是一个模板类,它使用了我第二个类的一些功能。第二个类继承自我的模板类。
下面是一个简化的结构:
// Foo.h
#pragma once
#include "Bar.h"
template <class T> class Foo
{
public:
void DoSomething();
};
template <class T> void Foo<T>::DoSomething()
{
Bar::GetInstance()->LogEvent();
}
//Bar.h
#pragma once
#include "Foo.h"
class Bar : public Foo<Bar>
{
public:
static Bar* GetInstance();
void LogEvent();
};
//Bar.cpp
#include "Bar.h"
Bar* Bar::GetInstance()
{
// return instance of Bar singleton class
}
void Bar::LogEvent()
{
// log some event in a file
}
现在的问题是,当我编译代码时,我在 bar.h 中收到以下错误
Bar.h() : error C2504: 'Foo' : base class undefined
Bar.h() : error C2143: syntax error : missing ',' before '<'
据我所知,这绝对是一个依赖问题。如果我从“DoSomething”中删除对“LogEvent”的调用,并从 Foo.h 中删除引用“Bar.h”,问题就会消失。
但这并不是真正的解决方案,因为 Foo 需要包含在 Bar 中的功能,相反,bar 继承自 Foo 并且需要包含对 Foo.h 的引用。
那么 - 我该如何解决这个问题?我浏览了有关循环引用的其他帖子,但我无法解决问题。
谢谢
【问题讨论】:
-
您在类定义的末尾缺少
;。 -
@Mankarse 感谢现场。它们是实际代码中的它们。我已经编辑了帖子。
-
另一方面,DoSomething() 是否需要在 Foo() 中?如果它需要 Bar,为什么不把它放在 Bar 中呢?
-
也许我错过了一些东西,但
T::GetInstance()会满足您的需求吗? (至少是你现在拥有的方式)? -
@dlf 感谢您的 cmets。我也设法编译成简化的代码。所以我有点难过。 DoSomething() 确实需要在 Foo 中。
标签: c++ templates inheritance circular-dependency circular-reference