Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2 / 2 / 3
Регистрация: 24.01.2016
Сообщений: 20
1

Занесение объекта в список в момент его создания

05.03.2016, 11:06. Показов 1114. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хочу реализовать подобную конструкцию для отображения всех объектов сразу с помощью статического листа ссылок, но ругается на _Ptr недопустимый указатель на ссылку при компиляции.

C++
1
2
3
4
5
6
7
for(auto s: Sprite::m_sprite_list) 
    {
        if(s.getGlobalBounds().intersects(GetVisibleCamera(camera->GetCamera())))
        {
            window.draw(s);
        }
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#pragma once
#include <iostream>
#include <SFML\Graphics.hpp>
#include "Resolution.h"
#include<list>
typedef sf::Vector2f vec2f;
 
class Sprite :
    public Resolution
{
protected:
 
    sf::RectangleShape m_Sprite;
    float m_Angle;
 
public:
 
    static std::list<sf::RectangleShape&> m_sprite_list;
 
    virtual inline void Rotate(float);  
    virtual inline void SetRotation(float); 
    virtual inline void SetTextureRect(sf::IntRect);
    virtual inline void SetPos(vec2f);
    virtual inline void SetOrigin(vec2f);
    virtual inline void Move(vec2f);
    virtual inline void SetSize(vec2f);
    virtual inline void SetColor(sf::Color);
    virtual inline void SetScale(float scale);
    virtual inline void SetTexture(sf::Texture&);
    virtual void SetAng(float);
    virtual void Sprite::MoveToAngle(float speed, float& time);
    virtual inline sf::Color GetColor() const;
    virtual inline vec2f GetPos() const;
    virtual inline vec2f GetSize() const;
    virtual inline float GetRotation() const;
    virtual float GetAngPos(sf::Vector2f);
    virtual float GetAng() const;   
    virtual sf::RectangleShape& GetSprite();    
    virtual sf::FloatRect GetRect();    
    virtual inline bool InterRect(sf::FloatRect&);  
    virtual inline bool Contains(vec2f);
 
    virtual void SetParam(vec2f position,vec2f size,sf::Texture& texture,bool is_origin);
 
    Sprite(vec2f position,vec2f size,sf::Texture& texture,bool is_origin);
    Sprite();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Sprite::Sprite(vec2f pos, vec2f size, sf::Texture& texture, bool isOrigin)
{
    m_Sprite.setSize(size*GetScr1());
    m_Sprite.setPosition(pos*GetScr1());
    if(isOrigin) m_Sprite.setOrigin(m_Sprite.getSize()/2.f);
    m_Sprite.setTexture(&texture);
    m_Angle = 0;
    m_sprite_list.push_back(m_Sprite);
}
 
Sprite::Sprite()
{
    m_Sprite.setSize(vec2f(0,0));
    m_Sprite.setPosition(vec2f(0,0));
    m_Sprite.setTexture(NULL);
    m_Angle = 0;
    m_sprite_list.push_back(m_Sprite);
}
 
void Sprite::SetParam(vec2f pos, vec2f size, sf::Texture& texture, bool isOrigin)
{
    m_Sprite.setSize(size*GetScr1());
    m_Sprite.setPosition(pos*GetScr1());
    if(isOrigin) m_Sprite.setOrigin(m_Sprite.getSize()/2.f);
    m_Sprite.setTexture(&texture);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2016, 11:06
Ответы с готовыми решениями:

Как после программного создания объекта добавить его на форму?
Как после программного создания объекта добавить его на форму? целый код: using...

перетаскивание объекта, сразу после его создания.код внутри
В этом простом приложение щелчком мыши создаётся обычный круг. и позднее его можно перетаскивать....

Найти момент импульса карандаша относительно точки опоры в момент его падения на стол
Карандаш длиной 15 см и массой 10 г, поставленный вертикально, падает на стол . Найти момент...

Отсортировать список файлов указанного каталога по датам создания и записать его в указанный файл
Создать командный файл, который сортирует список файлов указанного каталога по датам создания и...

4
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
05.03.2016, 11:29 2
Цитата Сообщение от SFMLoper Посмотреть сообщение
но ругается на _Ptr недопустимый указатель на ссылку при компиляции.
Приводите полный текст ошибки, без интерпретации пожалуйста в следующий раз.

По теме, элементы листа должны поддерживать копирование , а ссылка соответственно не позволяет копирование.
Т.е. ссылки в m_sprite_list нужно махнуть на указатели.
Либо баловаться std::reference_wrapper, что также будет указателем со всем вытекающим, разве что разыменует автоматически.
0
2 / 2 / 3
Регистрация: 24.01.2016
Сообщений: 20
05.03.2016, 11:43  [ТС] 3
Заменил на указатели, стал выводить

1>Game.obj : error LNK2001: неразрешенный внешний символ ""public: static class std::list<class sf::RectangleShape *,class std::allocator<class sf::RectangleShape *> > Sprite::m_sprite_list" (?m_sprite_list@Sprite@@2V?$list@PAVRectangleShape@sf@@V?$allocator@PAVRectangle Shape@sf@@@std@@@std@@A)"
1>Sprite.obj : error LNK2001: неразрешенный внешний символ ""public: static class std::list<class sf::RectangleShape *,class std::allocator<class sf::RectangleShape *> > Sprite::m_sprite_list" (?m_sprite_list@Sprite@@2V?$list@PAVRectangleShape@sf@@V?$allocator@PAVRectangle Shape@sf@@@std@@@std@@A)"
1>D:\SFML\Thirst for freedom\Debug\Arnold.exe : fatal error LNK1120: неразрешенных внешних элементов: 1



Ошибка 3 error LNK1120: неразрешенных внешних элементов: 1 D:\SFML\Thirst for freedom\Debug\Arnold.exe 1 1 Arnold
Ошибка 1 error LNK2001: неразрешенный внешний символ ""public: static class std::list<class sf::RectangleShape *,class std::allocator<class sf::RectangleShape *> > Sprite::m_sprite_list" (?m_sprite_list@Sprite@@2V?$list@PAVRectangleShape@sf@@V?$allocator@PAVRectangle Shape@sf@@@std@@@std@@A)" D:\SFML\Thirst for freedom\Thirst for freedom\Game.obj Arnold
Ошибка 2 error LNK2001: неразрешенный внешний символ ""public: static class std::list<class sf::RectangleShape *,class std::allocator<class sf::RectangleShape *> > Sprite::m_sprite_list" (?m_sprite_list@Sprite@@2V?$list@PAVRectangleShape@sf@@V?$allocator@PAVRectangle Shape@sf@@@std@@@std@@A)" D:\SFML\Thirst for freedom\Thirst for freedom\Sprite.obj Arnold
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
05.03.2016, 11:51 4
Лучший ответ Сообщение было отмечено SFMLoper как решение

Решение

SFMLoper, Почитайте про определение статических полей в С++.
А сделать нужно следующее: в Sprite.cpp написать:
C++
1
std::list<sf::RectangleShape *> Sprite::m_sprite_list;
1
2 / 2 / 3
Регистрация: 24.01.2016
Сообщений: 20
05.03.2016, 12:01  [ТС] 5
Благодарю!
0
05.03.2016, 12:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2016, 12:01
Помогаю со студенческими работами здесь

Момент создания компонента
на форме лежит TreeView и pageControl. на странице в педжконтроле в свойстве Onshow вот такой код -...

Момент создания окна
Уважаемые форумчане! Есть вопрос, как отловить момент создания окна, т.е есть дочернее окно, и...

Как сделать камеру дочерним объектом после создания другого объекта, или отображение сцены после создания самой камеры?
Есть кнопка при нажатии на неё создается куб ( с помощью Instantiate) как сделать камеру дочерним...

Занесение порядковых номеров из списка в список
Напишите пожалуйста код проги(с комментариями), по заданию. &quot;Пусть дан список А, содержащий целые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru