Работа с классами и sfml

364
11 января 2017, 01:49

Имеется класс button, который будет являться кнопкой в приложении. Используется вот так:

button playButton;
playButton.create(20, 20, 120, 30, "123, 123, 123, "some", "value");
window->draw(playButton);

Сам же класс таков:

class button {
    public:
        void create(int x, int y, int width, int height, char color, char name, char text)
        {
            sf::CircleShape name(50);
            name.setFillColor(sf::Color(color));
            name.setOutlineThickness(10);
            name.setOutlineColor(sf::Color(250, 150, 100));
            name.setPosition(x, y);
        }
    private:
};

Однако компилятор при попытке собрать программу плюётся, выдавая:

[Error] declaration of 'sf::CircleShape name' shadows a parameter

Никак не могу понять в чём дело. Если использовать вот так, не пытаясь засунуть в класс, а сунув в основной поток то всё нормально работает:

sf::CircleShape name(50);
name.setFillColor(sf::Color(123,123,123));
name.setOutlineThickness(10);
name.setOutlineColor(sf::Color(250, 150, 100));
name.setPosition(20, 20);
window->draw(name);
Answer 1

В этом определении функции- члена класса

void create(int x, int y, int width, int height, char color, char name, char text)
                                                             ^^^^^^^^^^   
{
    sf::CircleShape name(50);
                    ^^^^^^^^

объявление локальной переменной с типом sf::CircleShape скрывает одноименное объявление параметра с типом char, о чем вам компилятор и сообщает, так как такое определении функции не имеет смысла.

Помимо этого вы вызываете функцию, передавая в нее в качестве аргументов строковые литералы "some" и "value"

playButton.create(20, 20, 120, 30, "123, 123, 123, "some", "value");
                                                   ^^^^^^  ^^^^^^^

которые в общем случае, если соответствующие параметры не имеют ссылочные типы, неявно преобразуются в указатели на свои первые символы и имеют тип const char *, но никак не char. То есть компилятор еще должен выдать диагностическое сообщение о неправильных типах аргументов для этих параметров, то есть что он не может преобразовать, например, тип const char[5] в тип char для аргумента "some".

Кроме того обратите внимание, что локальная переменная name, объявленная в теле функции, станет не действительной после завершения работы функции. То есть время ее жизни - это тело функции во время его выполнения.

READ ALSO
Программный выбор строк QComboBox

Программный выбор строк QComboBox

Есть своя реализация древовидной модели на основе QAbstractItemModelНа основе этой модели отображаются виджеты QTreeView и QComboBox (т

378
Как получить -NaN в C++ 14

Как получить -NaN в C++ 14

Как в C++ 14 с компилятором g++ (GNU C++) 47

360