在类中定义公共结构
defining a public struct inside a class
嘿,我正在制作一个函数,用于收集您想要保留在屏幕上的精灵,并且
然后"Check()s"使它们停留,否则使它们在屏幕边缘反弹。
我在类("Object")中定义了一个结构,它包含对精灵的引用,以及它是否仍在屏幕外
(因此,在精灵实际返回到屏幕内部之前,reflect()函数不会再次调用)
关于以下代码,我有三个问题:
-
在Object结构中保存对精灵的引用是否允许我在调用reflect()时访问原始精灵,而不仅仅是副本?
-
为什么"Object"结构用红色下划线,表示
Error: implicitly generated constructor for class "OnScreenCheck::Object" cannot initialize.
-
在构造函数中,我创建一个Object实例,并将其传递到Objects向量中。我想,既然我把它传递给向量,向量就会复制并保存它,但我也在想,在构造函数完成后,实例是否会被破坏,搞砸了什么。它行得通吗?
感谢您的帮助!这是函数:
class OnScreenCheck
{
public:
struct Object{
mySprite& Sprite;
bool OffScreen;};
void AddObject(mySprite& aSprite){
Object newObject;
newObject.Sprite= aSprite;
newObject.OffScreen= false;
Objects.push_back(newObject);
};
void Check(){
// make sure box1 stays on the screen
for(int I=0; I< Objects.size(); I++){
//sprite has gone to high or to low
bool yColl (Objects[I].Sprite.Side(mySprite::top)>=ScreenHeight
|| Objects[I].Sprite.Side(mySprite::bottom)<=0);
//sprite has gone to far left or right
bool xColl (Objects[I].Sprite.Side(mySprite::left)<=0
|| Objects[I].Sprite.Side(mySprite::right)>ScreenWidth);
if(Objects[I].OffScreen==false){
if(yColl){
Objects[I].OffScreen= true;
Objects[I].Sprite.Reflect(180);}
if(xColl){
Objects[I].OffScreen= true;
Objects[I].Sprite.Reflect(90);}
}
}
};
EDIT:此外,我对structObject的意图不是拥有属于OnScreenCheck的公共数据类型,而是使数据类型只能由OnScreenCheck使用,因为它将这些"对象"保存到矢量对象中。它只是用来组织OnScreenCheck中的数据。我怎么能这样做,这样我就不必在OnScreenCheck构造函数中立即初始化对象了?
在Object结构中保存对精灵的引用是否允许我在调用reflect()时访问原始精灵,而不仅仅是副本
引用需要在创建时初始化,并且它们仍然绑定到它们别名的类型对象。因此,保存对sprite
的引用将始终指向同一个sprite
对象,任何使其别名为其他对象的尝试都将导致错误。
为什么"Object"结构用红色下划线,表示Error: implicitly generated constructor for class "OnScreenCheck::Object" cannot initialize.
您需要为OnScreenCheck
提供一个构造函数,该构造函数将适当地初始化Object
成员,尤其是sprite
的引用成员。该错误特别是因为引用必须在创建时初始化。
在构造函数中,我创建一个Object实例,并将其传递到Objects向量中。我想,既然我把它传递给向量,向量就会复制并保存它,但我也在想,在构造函数完成后,实例是否会被破坏,搞砸了什么。它行得通吗
向量将保存对象的副本,并且不会被销毁,除非您通过向量函数明确要求向量这样做,当然,除非您的对象有一些指针类型。
关于默认构造函数失败:
struct Object{
mySprite& Sprite;
bool OffScreen;};
默认构造时,您希望Sprite
具有什么值?它是一个引用,它必须引用一个现有的对象,但默认情况下没有。这就是错误的原因。
所以你可以这样做:
class OnScreenCheck
{
public:
struct Object{
Object(mySprite& aSprite, bool screen) : Sprite(aSprite), OffScreen(screen) {};
mySprite& Sprite;
bool OffScreen;};
void AddObject(mySprite& aSprite){
Object newObject(aSprite, false);
Objects.push_back(newObject);
};
添加
关于问题的补充——答案很简单:将其定义为private
或protected
(以备将来使用继承)。通过这种方式-OnScreenCheck
之外的任何代码都无法访问它。
只要原始对象保持活动状态(并且不会移动),引用就会有效。
Object
不能默认构造,因为创建引用时必须初始化。分配给引用不会更改引用,但会更改引用所指的对象。
将副本存储在矢量中并销毁原始副本似乎没问题。你可能只想要一个对象。
- 我的超类中的模板问题与结构定义
- 为私有结构定义双参数运算符重载
- 可视化C++中的结构定义错误
- 如何在结构定义中组合__attribute__((dllexport))和[[nodiscard]]?
- COM 互操作结构定义与内存布局不匹配
- C 在标题文件中创建具有结构定义的结构的队列
- 如何将结构定义为结构的成员
- 在这个节点定义中,为什么我们在结构定义之后使用"Node"?
- 不同模块中的ambigus结构定义
- 有条件的C/C 结构定义
- C++ 初始化结构定义中的向量
- 字符串声明中的结构定义中的字符串声明
- 使用结构定义函数
- 为具有许多数据成员的结构定义 == 和<
- enableif结构定义和默认模板参数
- C 使用模板为结构定义别名
- C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息
- 为C++结构定义显式析构函数如何影响调用约定
- 当结构定义在头文件中时,如何在main()中创建结构数组
- C结构定义标准