我目前面临一个非常令人不安的问题:
interface IStateSpace<Position, Value>
where Position : IPosition // <-- Problem starts here
where Value : IValue // <-- and here as I don't
{ // know how to get away this
// circular dependency!
// Notice how I should be
// defining generics parameters
// here but I can't!
Value GetStateAt(Position position);
void SetStateAt(Position position, State state);
}
Run Code Online (Sandbox Code Playgroud)
正如你到这里,既IPosition,IValue并IState互相依赖.我怎么能逃脱这个?我想不出任何其他设计会绕过这种循环依赖,仍然准确描述我想要做的事情!
interface IState<StateSpace, Value>
where StateSpace : IStateSpace //problem
where Value : IValue //problem
{ …Run Code Online (Sandbox Code Playgroud) 我在这里用C++实现了一个访问者模式.我有这个文件结构:
Base.h
---------------
#ifndef BASE_H
#define BASE_H
#include "visitor.h"
class Base{
public: virtual void accept(const visitor& v)=0;
};
#endif
Derived.h
-----------------
#ifndef DERIVED_H
#define DERIVED_H
#include "base.h"
#include "visitor.h"
class Derived : Base {
public: virtual void accept(const visitor& v);
};
#endif
visitor.h
------------------
#ifndef VISITOR_H
#define VISITOR_H
#include "base.h"
#include "derived.h"
class visitor {
void visit(const base& base);
void visit(const derived& derived);
};
#endif
Run Code Online (Sandbox Code Playgroud)
cpp文件只包含.h并定义上面链接中描述的acccept方法.我对这些文件结构的问题是标头之间的循环依赖.如果我用VS 2012编译它我得到这个错误:错误C2504:基类没有定义.谢谢你的建议,抱歉我的英语不好.
编辑:我已经更改了我的代码,如下所示:
Base.h
---------------
#ifndef BASE_H
#define BASE_H
//#include "visitor.h"
class …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我AppDelegate和我之间实现循环依赖,ViewController以从我AppDelegate到我调用方法,ViewController但是它不起作用。
请参阅我的代码,如下所示:
AppDelegate.h:
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong,nonatomic) ViewController *mainView;
@end;
Run Code Online (Sandbox Code Playgroud)
AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
[self.mainView doSomething];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
ViewController.h:
#import <UIKit/UIKit.h>
@class AppDelegate;
@interface ViewController : UIViewController
@property (strong,nonatomic) AppDelegate *delegate;
-(void)doSomething;
@end;
Run Code Online (Sandbox Code Playgroud)
ViewController.m:
- (void)viewDidLoad {
[super viewDidLoad];
self.delegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
}
- (void)doSomething
{
NSLog(@"doing something");
}
Run Code Online (Sandbox Code Playgroud)
我没有任何错误或警告,但doSomething …
所以我有两个结构体,为了简单起见,我们将它们称为A和B。A包含一个指向 的指针B,并B包含一个A。所以这里是代码:
啊
#ifndef A_H
#define A_H
#include "b.h"
typedef struct _A {
B *b;
} A;
#endif
Run Code Online (Sandbox Code Playgroud)
哈
#ifndef B_H
#define B_H
#include "a.h"
typedef struct _B {
A a;
} B;
#endif
Run Code Online (Sandbox Code Playgroud)
现在的问题是,当我从我的主 c 文件中导入 ah 时,我收到关于 A 是如何从 bh 未知类型的错误我不知道如何解决这个问题。
GetIt 是Dart 和 Flutter 项目的服务定位器( https://github.com/fluttercommunity/get_it )
我认为 GetIt 应该为我们提供一些有关循环依赖的详细信息。
例如,当我运行测试时,存在无限循环并且永远不会结束。
我目前正在我们的业务层中集成StructureMap,但由于双向依赖性而存在问题.
该层包含多个管理器,每个管理器可以相互调用方法:没有通信限制或规则.这还包括可能的循环依赖性,如下例所示.我知道设计本身是有问题的,但目前我们只是希望StructureMap能够工作,并将在未来专注于进一步的重构.
每个经理实现IManager接口:
internal interface IManager
{
bool IsStarted { get; }
void Start();
void Stop();
}
Run Code Online (Sandbox Code Playgroud)
并且还有自己的特定界面:
internal interface IManagerA : IManager
{
void ALogic();
}
internal interface IManagerB : IManager
{
void BLogic();
}
Run Code Online (Sandbox Code Playgroud)
这是两个虚拟管理器实现:
internal class ManagerA : IManagerA
{
public IManagerB ManagerB { get; set; }
public void ALogic() { }
public bool IsStarted { get; private set; }
public void Start() { }
public void Stop() { }
} …Run Code Online (Sandbox Code Playgroud) 我有三个文件:
testimports模块:
#import moduleTwo
import moduleOne
hiString = "Hi!"
moduleOne.sayHi()
Run Code Online (Sandbox Code Playgroud)
ModuleOne的:
import moduleTwo
class sayHi():
moduleTwo.printHi()
Run Code Online (Sandbox Code Playgroud)
ModuleTWO中:
import testimports
def printHi():
print(testimports.hiString)
Run Code Online (Sandbox Code Playgroud)
如果我跑testimports,我得到:
Traceback (most recent call last):
File "..file path snipped../testimports/src/testimports.py", line 2, in <module>
import moduleOne
File "..file path snipped../testimports/src/moduleOne.py", line 1, in <module>
import moduleTwo
File "..file path snipped../testimports/src/moduleTwo.py", line 1, in <module>
import testimports
File "..file path snipped../testimports/src/testimports.py", line 6, in <module>
moduleOne.sayHi()
AttributeError: 'module' object has no attribute 'sayHi'
Run Code Online (Sandbox Code Playgroud)
但是,如果我取消注释该import moduleTwo行 …
我正在处理C++中的循环依赖问题.
情况如下:
libA.so:
- Body.cpp
- Header.cpp
- DataObject.cpp
- DataObject::read(boost::asio::streambuf* data)
{
boost::asio::streambuf data;
....
body = (new DataConverter<Body>)->convert(&data);
header = (new DataConverter<Header>)->convert(&data);
}
libB.so:
- DataConverter.cpp
-> DataConverter<T>
-> T* DataConverter<T>::convert(boost::asio::streambuf* data)
libA.so <-> libB.so
Run Code Online (Sandbox Code Playgroud)
存在循环依赖性,因为libA使用来自libB的Converter-Class,而libB现在需要关于需要转换的libA的Object-Types - 因为DataConverter :: convert返回Body或Header对象.
我考虑用前向声明解决这个问题 - 但这对我来说似乎不是最干净的解决方案.总而言之,我的计划是提供可扩展的DataConverter解决方案.
你们有什么建议作为最佳做法?一个完全不同的设计也欢迎:)
最好,塞巴斯蒂安
测试用例代码非常不言自明.所以基本上,这样的事情可以不使用.cpp文件吗?
class A
{
public:
static int i;
static void test(void)
{
std::cout << "B::i = " << B::i << std::endl;
}
};
class B
{
public:
static int i;
static void test(void)
{
std::cout << "A::i = " << A::i << std::endl;
}
};
int A::i = 1;
int B::i = 2;
int main(int argc, char **argv)
{
A::test();
B::test();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个几年前在Objective C中完成的iOS项目.所以我要为现有的一个实现一些新功能,所以这次我正在使用Swift来达到这个目的.
我添加了一个新的Swift类:
class CampView: UIView
{
// Code
}
Run Code Online (Sandbox Code Playgroud)
我想在我现有的Objective C类中访问这个类.所以我喜欢:
@class CampView;
@interface NewCampViewController : UIViewController
@property (nonatomic, strong) IBOutletCollection(CampView) NSArray *campTypes;
@end
Run Code Online (Sandbox Code Playgroud)
但当我将它连接到我的故事板时,它会崩溃并显示一条消息:
由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是密钥值编码兼容的密钥campTypes.
另外我无法将我的系统生成的Swift头文件导入到这个特定的类中,当我这样做时会抛出如下错误:
找不到'MyApp-Swift.h'文件
这就是我@class CampView;在上面的片段中使用的原因.在调查时我发现我的NewCampViewController.h内容包含在Objective C桥接头中.所以怀疑它是由于循环依赖,但我无法解决它.
有人可以帮我解决这个问题吗?
c++ ×3
ios ×2
objective-c ×2
c ×1
c# ×1
dart ×1
extensible ×1
flutter ×1
generics ×1
import ×1
include ×1
oop ×1
python ×1
python-3.x ×1
struct ×1
structuremap ×1
swift ×1
templates ×1