我正在从Java转向C++,并且在理解C++类的基本工作原理以及设计它们的最佳实践方面遇到了很多麻烦。具体来说,我想知道是否应该在以下情况下使用指向我的类成员的指针。C++:如何提高将经常复制的自定义类的性能?
我有一个自定义类Foo,它表示某个特定回合的游戏状态,而Foo有一个自定义类Bar的成员变量,它表示该游戏状态的逻辑子集。例如,Foo代表棋盘,Bar代表受到攻击的棋子和逃脱棋子(不是我的具体情况,而是我认为更普遍的比喻)。
我想通过复制Foo并相应地更新副本的状态来搜索一系列移动。当我完成搜索移动序列时,我将放弃该副本,并仍然有我的原始Foo表示当前的游戏状态。
foo.h中,我宣布我的Foo类,我声明一个成员变量为它类型栏:在我的Foo构造我打电话酒吧构造与一些特定参数的实施
class Foo {
Bar b;
public:
Foo();
Foo(const Foo& f);
}
但到我将在运行时知道的当前状态。据我所知,这意味着一个Bar构造函数被调用两次 - 一次是因为我写了“Bar b;”如果我理解正确,它会调用默认构造函数),并且曾经因为我在Foo :: Foo()和Foo :: Foo(const Foo())中写入类似“b = Bar(arg1,arg2,...) f)。
如果我想尽可能多地制作Foo的拷贝,这是一个问题,对吧?
我在想一个简单的解决方案是声明一个指向Bar的指针,而不是:“Bar * b”,它应该避免两次实例化b。这是好的做法吗?这是否表明我应该知道的任何陷阱?有更好的解决方案吗?我找不到一个具体的例子来帮助我(除了很多关于使用指针的警告),并且关于设计类的所有信息都非常令人难以置信,所以任何指导都将不胜感激!
编辑:是的,当我创建我的Foo时,我将获得创建Bar所需的所有信息。我认为每个人都推断出这一点,但要清楚,我有更多的东西像这样已经为我的默认构造函数:
Foo(int k=5);
和Foo.cpp中:
Foo::Foo(int k) {
b = Bar(k);
...
}
,然后我Foo和其酒吧成员随着游戏状态的变化而逐步更新。
所以叫我的自定义栏的构造在我的Foo构造
声明
初始化列表看起来做的最好的方式。谢谢你的答案!
当声明refernces,这是一个很好的做法写'常量富&f',因为这很容易暗示f是参考。请记住,'const Foo & x, y;'意思是'x'是一个参考,但'y'不是。 – gruszczy 2010-02-28 18:58:04
@gruszczy:你的写作就像是普遍遵循的规则。但事实并非如此。这是个人偏好。两种方式都有很好的理由。 – sbi 2010-02-28 19:13:00
是的,缩进代码也不是普遍遵循的规则,这是一些人的个人偏好。但我不相信任何这些做法都有很好的理由。 – gruszczy 2010-02-28 19:47:38