我最近從 C# 切換到 C ,試圖學習 SFML 以進行圖形影片。
我試圖在運行時生成多個具有隨機半徑的 CircleShape,其參考保存為物件類,然后將其參考保存在向量陣列中。
但是,在生成形狀并遍歷陣列以從向量陣列中繪制形狀之后,似乎所有這些都是對同一形狀的參考。
我的代碼:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <random>
#include <ctime>
template <class T>
class Entity {
T* m_shape;
public:
Entity(T* shape)
{
m_shape = shape;
}
T* getShape() {
return m_shape;
}
};
class ShapesManager {
std::vector<Entity<sf::CircleShape*>*>* circleShape;
public:
ShapesManager()
{
circleShape = new std::vector<Entity<sf::CircleShape*>*>();
}
std::vector<Entity<sf::CircleShape*>*>* getCircleShapes()
{
return circleShape;
}
void addCircleShape(Entity<sf::CircleShape*>* EntityToAdd) {
circleShape->push_back(EntityToAdd);
}
};
int main()
{
const int windowWidth = 800;
const int windowHeight = 600;
sf::RenderWindow window(sf::VideoMode(windowWidth, windowHeight), "SFML works!");
//window.setVerticalSyncEnabled(true);
window.setFramerateLimit(60);
ShapesManager m_entityManager;
int lowSize = 25;
int highSize = 80;
for (int i = 0; i < 2; i ) {
srand(i 5732 (i * 524));
float circleRadius = lowSize static_cast<float>(rand()) * static_cast<float>(highSize - lowSize) / RAND_MAX;
sf::CircleShape* someValue = new sf::CircleShape(circleRadius);
(*someValue).setPosition((circleRadius * 2), (circleRadius * 2));
Entity<sf::CircleShape*>* myObj = new Entity<sf::CircleShape*>(&someValue);
m_entityManager.addCircleShape(myObj);
}
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
for (Entity<sf::CircleShape*>* cE : ((std::vector<Entity<sf::CircleShape*>*>)* m_entityManager.getCircleShapes())) {
Entity<sf::CircleShape*> myCircleEntity = *cE;
sf::CircleShape* cS = *myCircleEntity.getShape();
window.draw((*cS));
}
window.display();
}
return 0;
}
我已經多次檢查我的代碼,以確保我沒有為所有其他形狀參考單個形狀。
*我在嘗試尋找解決方案時遇到了“共享指標/唯一指標”,雖然我還沒有掌握它,但如果我應該用它來幫助解決我的問題,請務必提及它在評論中,因為我正在尋找更多的知識而不是直接的解決方案。
uj5u.com熱心網友回復:
我認為@AlanBirtles 是對的。在每次迭代new sf::CircleShape(circleRadius);中分配新的記憶體,所以指標someValue每次都會指向不同的記憶體地址。您不能對someValue自身的記憶體地址說同樣的話,在您的情況下,指標似乎someValue在每次迭代時都在相同的記憶體地址中創建,這就是為什么在每次迭代中參考該指標都會回傳相同的值。
@AlanBirtles 建議的解決方案應該足夠了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/512405.html
標籤:C 指针堆内存sfml
下一篇:如何讓一個類接受另一個類的引數?
