我经常看到这些声明:
class A
{
private:
int a;
int b;
public:
// Ctor + Dtor + methods
};
class B
{
private:
int a;
int b;
public:
// Ctor + Dtor + methods
};
class C
{
private:
A* aClass;
B* bClass;
// Other members.
public:
// Ctor + Dtor + methods
};
使用new运算符动态分配 aClass
和bClass
。
很多人在没有理由的情况下倾向于使用堆。动态分配A
和B
类将减少堆栈上C
对象的大小。然而,新的运营商是昂贵的" (执行时间),假设我们为A
和B
中包含的所有变量设置了getter和setter,设置或获取A
和/或B
的成员将导致一些额外的计算,以便访问A
或B
(取消引用A
或B
,然后进行操作。)
以下是我的问题:
写下面的内容会更好吗?
class C
{
private:
A aClass;
B bClass;
// ....
}
可以用大对象进行这种方式导致堆栈溢出吗?
如果编译器不知道"真实类型"是否能够进行某些优化? A*
和B*
?
我忘了在两种情况下都提到C是一种成分(感谢C.LECLERC)。第一种情况用于实现构图。
答案 0 :(得分:0)
好的,如果你做了一个甲板和卡片类。看下面
namespace game{
enum Rank{ACE=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,
EIGHT,NINE,TEN,JACK,KING,QUEEN};
enum Suit{SPADE,DIAMOND,CLUB,HEART};
Class Card{
public:
Card(){
suit = HEART;
rank = ACE;
}
Card(int s, int r){
suit = static_cast<Suit>(s);
rank = static_cast<Rank>(r);
}
private:
Rank rank;
Suit suit;
};
Class Deck{
public:
Deck(int count){
card = new Card[count];
}
// You would need a copy constructor of course but im lazy
~Deck() { delete [] card; } // Manually deallocate
private:
Card *card;
};
}
现在,如果我们转到主要并制作了一个新牌组,那么这个牌组将拥有用户在其中键入的牌数。这只是我要使用的一个例子,并说我们制作了52张空白卡片,让我们在卡片中创建一个卡片,使用另一种制作随机卡片的方法,或者可能是标准卡片。
你要问的事情有点奇怪,因为你定义了A和B类所以什么是“真正的类型”
当然有些东西比其他东西运行更快或更慢,比如在阵列上使用线性或二进制搜索,一个显然更快。
在分配这些对象时研究内存的关系。
还要密切关注构图,聚合和更多关系。
至于堆栈溢出,您是在使用嵌入式系统,还是制作一百万个对象,否则您应该没问题!