Я хочу иметь массив sf :: Texture (sfml) в классе, а затем хочу иметь функцию, которая возвращает указатель на этот конкретный элемент в массиве (векторе). Затем я хочу передать это sprite.SetTexture (также SFML), который требует sf :: texture. Но я не могу заставить его работать, это то, что у меня сейчас есть, неважные вещи я пропустил:
class SpriteTextures
{
public:
std::vector<sf::Texture> Textures;
//code to fill the vector here
sf::Texture *GetSecondTexture()
{
return &Textures[1];
}
};
class DrawSprite
{
sf::Texture *texture;
sf::Sprite sprite;
public:
void SetSpriteTexture()
{
SpriteTextures SprTexs;
texture = SprTexs.GetSecondTexture();
sprite.setTexture(texture, true); // Gives error about no suitable constructor exists to convert from sf::Texture * to sf::Texture
// do some other stuff with the texture here.
}
};
и это определение функции Sprite :: setTexture:
void setTexture(const Texture& texture, bool resetRect = false);
И ошибку, которую он дает, я поместил в качестве комментария в код (рядом с функцией setTexture) Поэтому я хочу, чтобы вместо копирования элемента вектора в переменную текстуры в классе DrawSprite, я хочу, чтобы текстура * в DrawSprite указывала на элемент в векторе. Но я хочу сначала установить * текстуру в DrawSprite, так как я хочу использовать ее и для других целей. Поэтому я хочу иметь возможность предоставить функцию setTexture с моей * текстурой и заставить ее читать sf :: Texture в векторе в классе SpriteTextures (вместо того, чтобы читать ее копию в переменной текстуры в самом классе DrawSprite.
ТАК, если кто-то понимает, что я только что сказал, может ли кто-нибудь помочь мне заставить его работать правильно?
Спасибо!
Если вы не знаете, как получить ссылку из указателя, возможно, вам следует прочитать книгу по C++, прежде чем переходить к сторонним библиотекам, таким как SFML. Это очень основная информация.
Я не могу заставить его работать, вот почему я спрашиваю.
Быстрое решение здесь - вернуть ссылку из вашей функции GetSecondTexture вместо указателя. Так как setTexture берет ссылку.
@Benjamin Lindley, я знаю, как получить ссылку, но не знаю, как объединить ее с sfml setTexture.
Похоже, вы используете texture как локальную переменную. Если это так, объявите и используйте локальную переменную.
@Carl, вы имеете в виду вот что: sf :: Texture & GetSecondTexture ()?
sprite.setTexture(*texture, true); Я здесь что-то очевидное упускаю?
@ S.M. Я использую его и в других функциях этого класса, он не показан, потому что он не имеет отношения к делу.
@ Стивен Ньюэлл, да, он не берет указатель
Прочтите хорошая книга по C++
@TimLeijten - Обратите внимание на звездочку перед texture в моем комментарии.
@TimLeijten: Нет, вы, очевидно, не знаете, как получить ссылку из указателя, иначе вы бы узнали, что комментарий Стивена делает именно это.





В основном в этой функции:
void SetSpriteTexture()
{
SpriteTextures SprTexs;
texture = SprTexs.GetSecondTexture();
sprite.setTexture(texture, true); // Gives error about no suitable constructor exists to convert from sf::Texture * to sf::Texture
// do some other stuff with the texture here.
}
Вы передаете sf::Texture* в sprite.setTexture(..), тогда как на самом деле это требует sf::Texture&. Просто измените вызов на:
sprite.setTexture(*texture, true);
Или, в качестве альтернативы, сделайте так, чтобы ваша другая функция просто возвращала ссылку:
sf::Texture& GetSecondTexture()
{
return Textures[1];
}
Это означает, что теперь вы возвращаете то, что нужно спрайту по умолчанию. Конечно, вы должны убедиться, что ваш контейнер текстуры остается живым по крайней мере столько же, сколько и ваш спрайт, в противном случае ссылка на текстуру больше не будет действительной.
РЕДАКТИРОВАТЬ
Кроме того, глядя на комментарии, кажется, что вы слегка запутались в операторе * и операторе &. Вот небольшой фрагмент, объясняющий различные варианты использования этих операторов:
int a = 42;
int* b = &a; // * Declares pointer. & Takes address of a
int& c = a; // & Declares reference.
*b = 32; // * Dereferences the pointer, meaning you get the value it points to.
// a, and c are now 32, and b points to a, which holds the value 32.
Спасибо, не знала, что это так просто. Пойду и возьму в библиотеке книгу по C++, чтобы узнать несколько указателей.
Второй вариант не решит проблему. Ему просто потребуется взять адрес возвращаемого значения, чтобы сохранить его в переменной texture.
@TimLeijten Также проверьте обновленное редактирование, чтобы увидеть дополнительные объяснения синтаксиса.
@BenjaminLindley Вторая альтернатива также потребовала бы перепроектирования этого класса, да. Сохранение ссылки или ее отсутствие. Поскольку это минимальный пример, я решил включить альтернативу, так как не знаю, как выглядит полная программа.
Спасибо, а что было бы умнее сделать? У меня есть указатель возврата функции или ссылка?
Оказалось, что это были не просто указатели, у меня было 2 файла .h, включающих друг друга, что вызывало ошибки, и это то, что заставило меня подумать, что мои классы и использование указателей были изношены.
Попытайтесь заставить его работать с
int[], прежде чем пытаться заставить его работать со сложными классами.