我有四个不同的文件:main,vector,entity和physics.我不会发布所有代码,只发布导入,因为我认为这就是错误所在.(如果你愿意,我可以发布更多)
主要:
import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement
Run Code Online (Sandbox Code Playgroud)
实体:
from vector import Vect
from physics import Physics
class Ent:
#holds vector information and id
def tick(self, dt):
#this is where physics changes the velocity and position vectors
Run Code Online (Sandbox Code Playgroud)
向量:
from math import *
class Vect:
#holds i, j, k, and does vector math
Run Code Online (Sandbox Code Playgroud)
物理:
from entity import Ent
class Physics:
#physics class gets an entity …Run Code Online (Sandbox Code Playgroud) 我经常发现自己处于一种情况,我在C++项目中面临多个编译/链接器错误,因为一些糟糕的设计决策(由其他人做出:))导致不同头文件中C++类之间的循环依赖(也可能发生)在同一个文件中).但幸运的是(?)这种情况经常不足以让我在下次再次发生问题时记住这个问题的解决方案.
因此,为了便于将来回忆,我将发布一个代表性问题和解决方案.更好的解决方案当然是受欢迎的.
A.h
class B;
class A
{
int _val;
B *_b;
public:
A(int val)
:_val(val)
{
}
void SetB(B *b)
{
_b = b;
_b->Print(); // COMPILER ERROR: C2027: use of undefined type 'B'
}
void Print()
{
cout<<"Type:A val="<<_val<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)B.h
#include "A.h"
class B
{
double _val;
A* _a;
public:
B(double val)
:_val(val)
{
}
void SetA(A *a)
{
_a = a;
_a->Print();
}
void Print()
{
cout<<"Type:B val="<<_val<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)main.cpp
#include "B.h" …Run Code Online (Sandbox Code Playgroud)如果两个模块相互导入会发生什么?
为了概括这个问题,Python中的循环导入怎么样?
我知道python中循环导入的问题已经出现过很多次了,我已经阅读过这些讨论了.在这些讨论中反复提出的评论是,循环导入是设计错误的标志,应重新组织代码以避免循环导入.
有人可以告诉我如何在这种情况下避免循环导入吗?:我有两个类,我希望每个类都有一个构造函数(方法),它接受另一个类的实例并返回该类的实例.
更具体地说,一个类是可变的,一个是不可变的.散列,比较等需要不可变类.可变类也需要做事.这与sets和frozensets或者列表和元组类似.
我可以将两个类定义放在同一个模块中.还有其他建议吗?
玩具示例是类A,其具有属性是列表,而类B具有属性是元组.然后类A有一个方法,它接受类B的实例并返回类A的实例(通过将元组转换为列表),类似地,类B有一个方法,它接受类A的实例并返回类B的实例(通过将列表转换为元组).
所以我收到了这个错误
Traceback (most recent call last):
File "/Users/alex/dev/runswift/utils/sim2014/simulator.py", line 3, in <module>
from world import World
File "/Users/alex/dev/runswift/utils/sim2014/world.py", line 2, in <module>
from entities.field import Field
File "/Users/alex/dev/runswift/utils/sim2014/entities/field.py", line 2, in <module>
from entities.goal import Goal
File "/Users/alex/dev/runswift/utils/sim2014/entities/goal.py", line 2, in <module>
from entities.post import Post
File "/Users/alex/dev/runswift/utils/sim2014/entities/post.py", line 4, in <module>
from physics import PostBody
File "/Users/alex/dev/runswift/utils/sim2014/physics.py", line 21, in <module>
from entities.post import Post
ImportError: cannot import name Post
Run Code Online (Sandbox Code Playgroud)
你可以看到我进一步使用相同的import语句并且它有效吗?关于循环导入是否有一些不成文的规则?如何在调用堆栈中进一步使用相同的类?
假设我有以下目录结构:
a\
__init__.py
b\
__init__.py
c\
__init__.py
c_file.py
d\
__init__.py
d_file.py
Run Code Online (Sandbox Code Playgroud)
在a包中__init__.py,c导入包.但是c_file.py进口a.b.d.
程序失败,说尝试导入b时不存在.(它确实不存在,因为我们正在进口它.)c_file.pya.b.d
如何解决这个问题呢?
我有两个文件,node.py并且path.py,它定义了两个类,Node并Path分别.
到目前为止,Path引用该Node对象的定义,因此我已经完成了
from node.py import *
Run Code Online (Sandbox Code Playgroud)
在path.py文件中.
但是,截至今天,我创建了一个Node引用该Path对象的新方法.
我在尝试导入时遇到了问题path.py:我尝试过,当程序运行并调用使用的Path方法时Node,一个异常上升,Node因为没有定义.
我该怎么办?
您可以构建一个C++程序,以便(几乎)所有代码都驻留在Header文件中.它本质上看起来像一个C#或Java程序.但是,.cpp在编译时,至少需要一个文件来提取所有头文件.现在我知道有些人绝对会厌恶这个想法.但我没有发现任何令人信服的缺点.我可以列举一些优点:
[1]编译时间更快.所有头文件只被解析一次,因为只有一个.cpp文件.此外,一个头文件不能包含多次,否则您将获得构建中断.在使用备用方法时,还有其他方法可以实现更快的编译,但这很简单.
[2]通过使它们绝对清楚,它避免了循环依赖.如果ClassA在ClassA.h对循环依赖ClassB的ClassB.h,我必须把前向参考与它伸出.(请注意,这与C#和Java不同,编译器会自动解析循环依赖关系.这会鼓励编写错误的编码实践IMO).同样,如果您的代码在.cpp文件中,您可以避免循环依赖,但在实际项目中,.cpp文件往往包含随机标题,直到您无法确定谁依赖于谁.
你的意见?
c++ architecture compilation circular-dependency header-files
我正在研究Go项目一个月.好的是Go非常高效.但经过一个月的开发,我已经有了数千行代码和许多代码packages.为了避免导入周期对我来说是一个主要的问题,任何时候我遇到导入周期错误,我不知道第一次问题可能在哪里.
Go编译器也只有非常简单的通知,总是不能很好地快速定位问题,如:main.go:7:3: import cycle not allowed.它只会帮助您了解哪个文件可能导致问题,但不会更深入.由于import关系在代码增长时变得越来越复杂,我迫切希望知道如何在Go中更有效地避免导入周期.任何帮助深表感谢.
处理对象并让它们互相交流的好方法是什么?
到目前为止,我所有的游戏爱好/学生都很小,所以这个问题通常以一种相当丑陋的方式解决,导致紧密集成和循环依赖.这对我正在做的项目规模来说很好.
然而,我的项目在规模和复杂性方面都变得越来越大,现在我想开始重新使用代码,让我的头脑更简单.
我遇到的主要问题通常是Player需要知道的问题Map,因此Enemy,这通常会导致设置大量指针并具有大量依赖关系,这很快变得混乱.
我按照消息风格系统的思路思考.但我真的不知道这是如何减少依赖性的,因为我仍然会在各处发送指针.
PS:我想这之前已经讨论过,但我不知道它的所谓只是我需要的东西.
c++ design-patterns circular-dependency tightly-coupled-code
python ×6
c++ ×3
dependencies ×2
import ×2
architecture ×1
c++-faq ×1
compilation ×1
go ×1
header-files ×1
importerror ×1