Передайте аргумент для использования в определении структуры

0

Я хочу объявить структуру:

struct myStruct{
    myType myVar[mySize];
    //...
};

Как мне это сделать, или где я помещаю это, чтобы мне разрешалось это делать, когда значение mySize известно во время выполнения?

mySize фактически имеет значение по умолчанию, но пользователь может предоставить другое значение через стандартный ввод. Затем этот настраиваемый размер передается функции, в которой определена структура.

Но если структура находится внутри определения функции, я получаю сообщение о том, что ему не разрешено быть переменной, и если я помещаю его вне функции (в заголовке), он жалуется, что mySize не определен - конечно, это не проходил там никакими средствами.

Я предполагаю, что решение лежит в ООП *, но это не то, что я еще изучал.

* Если это ложное предположение, скажите мне, чтобы я мог удалить тег.

Теги:
scope
struct
oop

2 ответа

1

Массив AC не может иметь динамический размер в C++ как член класса. Тем не менее, C++ имеет класс, который предоставляет именно это: std::vector.

Это дает нам:

struct myStruct {
    std::vector<myType> myVar;

    myStruct(std::size_t size = default_size)
        : myVar(size) {}
};

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

  • 0
    Но это не динамический размер, это исправлено во время выполнения. Конечно, есть различие там?
  • 0
    @ Олли Нет. Исправлено во время выполнения = динамическое.
Показать ещё 1 комментарий
1

Вы можете использовать вектор

#include <vector>
struct myStruct
{
public:
  // this is your array
  std::vector<myType> myVar;

  // this is the default constructor
  // this tells that the user will be passing a number
  myStruct(int const &mySize)
  {
    myVar.resize(mySize);
  }
};

Таким образом, в основном

int main()
{
  myStruct example(10);
  return 0;
}

Таким образом, вам не нужно беспокоиться об управлении памятью.

myStruct - это объект.

Есть два типа памяти, стек и куча, вы должны узнать о них, если хотите попасть в указатели и управление памятью. Я расскажу вам, как это сделать с указателями, но я не рекомендую вам идти по этому пути так скоро

struct myStruct
{
public:
  // this is your array
  myType *myVar;

  // this is the default constructor
  // this tells that the user will be passing a number
  myStruct(int const &mySize)
  {
    myVar = new myVar[mySize];
  }

  // this is your default destructor
  ~myStruct()
  {
    delete[] myVar;
  }
};

Но myVar становится указателем, и он обрабатывается иначе, чем вектор.

Вектор является частью стандартной библиотеки C++. Если это не для домашней работы, я предлагаю вам использовать ее.

  • 0
    «Есть два типа памяти: стек и куча». Будьте осторожны с этим утверждением. Обратите внимание, что стандарт C ++ не говорит о стеке или куче, он говорит о статической и динамической продолжительности хранения. Как реализуются эти категории продолжительности хранения, определяется реализацией.
  • 0
    Действительно, но проект ISO / IEC N3691 даже не начинает описывать недостатки использования указателей над векторами. Тот факт, что его нет в стандарте, не означает, что его не следует обсуждать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню