gpt4 book ai didi

c++ - c++ 中多态类的编译器问题

转载 作者:行者123 更新时间:2023-12-02 11:09:30 24 4
gpt4 key购买 nike

这个问题不太可能帮助任何 future 的访客;它仅与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the help center .




8年前关闭。




我正在为我正在学习的 c++ 类开发一个项目,但我无法找出一些编译器错误。我的文件应该编写一个基类 sprite,它具有多态函数 draw,其他 4 个类继承自该函数。但是我无法弄清楚这些编译器问题!

main.cpp: In function ‘int main()’:

main.cpp:72:47: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default]

main.cpp:72:47: error: assigning to an array from an initializer list

main.cpp:73:23: error: expected primary-expression before ‘)’ token

main.cpp:74:21: error: expected primary-expression before ‘)’ token

main.cpp:75:22: error: expected primary-expression before ‘)’ token

main.cpp:76:20: error: expected primary-expression before ‘)’ token

main.cpp:81:13: warning: deleting array ‘Sprite array [4]’ [enabled by default]



这是我的代码!
#include "drawing.h"
class Sprite
{
friend class Shadow;
friend class Speedy;
friend class Bashful;
friend class Pokey;
private:
int row;
int col;
public:
int getCol()
{
return col;
}
int getRow()
{
return row;
}
void setPosition(int x, int y)
{
row = x;
col = y;
}
virtual void draw()
{
drawErrorMessage(row, col);
}
};

class Shadow: public Sprite
{
public:
virtual void draw()
{
drawShadow(row,col);
}
};
class Speedy: public Sprite
{
public:
virtual void draw()
{
drawSpeedy(row,col);
}
};

class Bashful: public Sprite
{
public:
virtual void draw()
{
drawBashful(row,col);
}
};
class Pokey: public Sprite
{
public:
virtual void draw()
{
drawPokey(row,col);
}
};

int main()
{
Sprite array[4];
beginDrawing();
array = {Shadow(),Speedy(),Bashful(),Pokey()};
((Shadow) (array[0]*)).setPosition(5,10);
((Speedy)(array[1]*)).setPosition(5,44);
((Bashful)(array[2]*)).setPosition(22,44);
((Pokey)(array[3]*)).setPosition(22,10);
array[0].draw();
array[1].draw();
array[2].draw();
array[3].draw();
delete [] array;
endDrawing();
}

最佳答案

您正在做的事情存在各种问题:

1)您正在尝试将初始化列表分配给数组:

array = {Shadow(),Speedy(),Bashful(),Pokey()};

这是有效的 C++11,但不是有效的 C++98。

2) 即使您使用的是 C++11,这也是一件不幸的事情,因为分配了 ShadowSprite将导致切片(SpriteShadow 子对象将被分配,但 Shadow 的其余部分不会被分配)。见 What is object slicing?更多示例。

3) 你正在尝试 delete[]堆栈分配的数组:

Sprite array[4];
//...
delete [] array;

一般只调用 delete[]关于你的事情 new[] .简单(无关)示例:
int *arr = new int[4];
delete [] arr;

在这个问题的上下文中,您分配的是数组的元素,而不是数组本身,它是您需要删除的元素(使用 delete 而不是 delete[] ,因为它们是分配给 new 而不是 new[])。

4) 你试图对动态类型为 Sprite 的对象进行多态调用。 .数组的每个元素都是 Sprite .您可能的意思是拥有 Sprite* 的数组,因此每个元素都可以指向 Shadow , 或 Speedy , 或 ... 此时,指向对象的动态类型将是 Shadow , Speedy等,并进行多态调用,例如 array[i]->draw()会有意义。

5) 此语法无效:
((Shadow) (array[0]*)).setPosition(5,10);

我假设您正在尝试(根据下面的指针数组思考)执行以下操作:
(*static_cast<Shadow*>(array[0])).setPosition(5,10);

实际上,您几乎可以肯定只是想要:
array[0]->setPosition(5,10);

一般来说,您的代码没有做正确的事情。你可能想要更像这样的东西:
class Sprite
{
private:
int col, row;
public:
virtual ~Sprite() {}

virtual void draw()
{
drawErrorMessage(row, col);
}

int getCol() const
{
return col;
}

int getRow() const
{
return row;
}

void setPosition(int row_, int col_)
{
row = row_;
col = col_;
}
};

class Shadow : public Sprite
{
public:
/*virtual*/ void draw()
{
drawShadow(row, col);
}
};

// etc.

int main()
{
const int SPRITE_COUNT = 4;
Sprite *array[SPRITE_COUNT];
array[0] = new Shadow;
array[0]->setPosition(5, 10);
// etc.
beginDrawing();
for(int i = 0; i < spriteCount; ++i)
{
array[i]->draw();
delete array[i]; // note: polymorphic deletion, hence the need for a virtual destructor
}
endDrawing();
return 0;
}

关于c++ - c++ 中多态类的编译器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16703664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com