Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 05.04.2021
Сообщений: 2

Lua, c++ и ООП, создание новой переменной из c++ для класса в lua

05.04.2021, 22:36. Показов 3525. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Не спеша изучаю Lua в связке с плюсами. Захотелось мне динамически из кода с++ создавать объекты.
За основу я брал статью на хабре https://habr.com/ru/post/259265/, точнее комментарий к ней.
У себя попробовал - вроде работает... но только в Lua скрипте:

скрипт:
Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Frame = Object:inherit(
{
  className = "Frame",
  x = 0,
  y = 0,
  width = 0,
  height = 0,
  isFrame = 0,
  textureName = "",
  spriteCount = 0,
  spriteWidth = 0,
  spriteHeight = 0
})
 
testFrame = Frame:new()
testFrame.width = 1024
print("testFrame.width =" ..    testFrame.width)
Данный код работает и хорошо, Но а вот как создать динамически переменную из c++ - что-то возникли заминки.
У меня есть класс помошник с функцией исполнения кода в Луа
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
int LuaHelper::executeString(const QString &cmd)
{
  int top = checkLuaStackTop();
 
  int retVal = luaL_dostring(m_L, cmd.toStdString().data());
  if (retVal != 0) {
    qDebug() << "Error: luaL_dostring failed!";
    while (checkLuaStackTop(true) != top) {
      QString str;
      if (lua_isstring(m_L, -1)) {
        str = QString(lua_tostring(m_L, -1));
      } else {
        str = "unknown conversion value";
      }
      qDebug() << "error =" << str;
      lua_pop(m_L, 1);
    }
    return -1;
  }
 
  while (checkLuaStackTop(true) != top) {
    QString str;
    if (lua_isstring(m_L, -1)) {
      str = QString(lua_tostring(m_L, -1));
    } else if (lua_isnumber(m_L, -1)) {
      str = QString::number(lua_tonumber(m_L, -1));
    } else if (lua_isinteger(m_L, -1)) {
      str = QString::number(lua_tointeger(m_L, -1));
    } else {
      str = "unknown conversion value";
    }
    qDebug() << "in stack =" << str;
    lua_pop(m_L, 1);
  }
 
  return 0;
}
Что-то типа подобного он исполняет на ура:
C++
1
2
3
executeString("varA = {}");
executeString("varA.Name = \"VarA\"");
getLuaVariantValue("varA.Name", &strVar);
где "getLuaVariantValue" выводит результат
А вот на команде
C++
1
executeString("varFrame = Frame:new()");
Сильно ругается:
Code
1
in stack = "[string \"varFrame = Frame.new()\"]:1: attempt to call a nil value (field 'new')"
Хотя по идее должен сделать то же самое что и во фрагменте луа скрипта (testFrame = Frame:new()). Там это работает, а из плюсов - нет.

В чем у меня недопонимание осталось?
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2021, 22:36
Ответы с готовыми решениями:

Lua наследование, lua ооп
Подскажите пожалуйста, как наследовать класс? Не получается выдаёт ошибку local car = {} -- Прежде чем создавать экземпляры объекта,...

Регистрация C# класса для Lua
Начал работать с Lua, узнал как регистрировать функции, однако как регистрировать класс, чтобы вызывать его методы, пока не могу понять. ...

Подскажите по ООП в Lua
Всем привет! Изучаю язык и попытался коснуться объектов. Что нужно подправить чтобы код работал ? Groop = {} -- Создаем группу людей...

1
0 / 0 / 0
Регистрация: 05.04.2021
Сообщений: 2
07.04.2021, 13:03  [ТС]
Покурил немного и пришел к более менее удобоваримому решению:

библиотечный скрипт (загружается в Луа первым):
Lua
1
2
3
4
5
6
7
8
9
10
11
12
Object = {}
 
function Object:new(properties)
  properties = properties or {}     -- create table if 'properties' is nil
  setmetatable(properties, self)    -- set prototype table 'properties' to self
  self.__index = self               -- change __index
  return properties                 -- return new object
end
 
function Object:inherit(properties)
  return self:new():new(properties) --
end
скрипт класса (загружается соответственно после всех библиотечных):
Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Frame = Object:inherit(
{
  className = "Frame",
  x = 0,
  y = 0,
  width = 1,
  height = 1,
  isFrame = 0,
  textureName = "tst.png",
  spriteCount = 0,
  spriteWidth = 0,
  spriteHeight = 0
})
 
frameSrc = Frame:new()
Магия заключалась в объявлении исходного класса в коде луа (frameSrc), от которого в последствии можно делать копии
C++
1
2
3
4
5
6
7
8
9
10
11
executeString("varA = frameSrc:new()");
  executeString("varA.textureName = \"texture1.png\"");
 
  executeString("varB = frameSrc:new()");
  executeString("varB.textureName = \"texture2.png\"");
 
  getLuaVariantValue("varA.textureName", &strVar);
  getLuaVariantValue("varB.textureName", &strVar);
 
  executeString("varA = nil");
  executeString("varB = nil");
Вывод дебага результата функций 'getLuaVariantValue':
Code
1
2
"varA.textureName" = "texture1.png"
"varB.textureName" = "texture2.png"
Тему считать закрытой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2021, 13:03
Помогаю со студенческими работами здесь

Lua, ооп библиотеки, виртуальные функции
Не подскажет ли кто ооп библиотеку с возможностью создания виртуальных функций - и самое главное с возможностью из виртуальной функции...

Lua C API название переменной по индексу
Как в C++ узнать название Lua переменной имея её (переменной) индекс? Добавлено через 19 часов 7 минут Почитав документацию я не...

Как в Lua корректно отправить значения из класса update?
как в Lua корректно отправить значения из класса update? Прошу помочь, мне нужно просто чтобы живой человек помог мне понять что я...

Хранение данных класса, имеющего подключаемые lua-скрипты
Ну, в общем дело обстояло так: Предыстория для понимания сути вопроса Допустим, хочу я иметь базу данных (ну или иной вид...

Скажите, пожалуйста, как правильно реализовать работу методов класса в lua api c++
вот самая простая структура. как вызвать ее конструктор и метод в lua. Подскажите, пожалуйста. using namespace std; struct...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru