#c #class #object #structure
#c #класс #объект #структура
Вопрос:
У меня вопрос. Возможно ли создать несколько объектов во время выполнения для классов или структур?
#include<iostream>
#include<conio.h>
using namespace std;
struct node
{
int no;
};
int main()
{
int i;
for(i=0;i<4;i )
{
struct node s[i];
}
cout<<"Enter the values";
for(i=0;i<4;i )
{
cin>>s[i].no;
}
cout<<"The values are:";
for(i=0;i<4;i )
{
cout<<s[i].no<<endl;
}
getch();
return 0;
}
Я попробовал метод, описанный выше, но безуспешно . Любая помощь будет оценена
Комментарии:
1. Ваша программа представляет собой странную смесь C и C . Добавление
struct
перед именем структуры — это C-синтаксис,using namespace
это C -синтаксис. Можно использовать библиотеки из любой программы на C , но я бы настоятельно рекомендовал вам не путать там C-синтаксис.2. О, спасибо, что поправили меня, я новичок. Я бы исправил это в будущем 🙂
3. Я надеюсь, что так 🙂 К сожалению, это немного сложно изучить самостоятельно, если вы можете, я предлагаю вам выбрать книгу (прочитайте тег about C , он ссылается на список).
4. Использование struct в C допустимо на 100%. C не является объектно-ориентированным языком. Это язык, который ПОДДЕРЖИВАЕТ создание типов, некоторые из которых могут быть или не быть классами, экземпляры которых будут объектами.
Ответ №1:
заменить
for(i=0;i<4;i )
{
struct node s[i];
}
с
struct node s[4];
то, как вы написали свою программу, не будет работать. Вы определили массив узлов s внутри блока, чтобы он не был виден за пределами этого блока.
Если вы хотите динамически выделять память, вам нужно сделать что-то вроде:
struct node *s = new node[YourDesiredSize];
или, если вам нравится стиль c (не рекомендуется):
struct node *s;
s = (node*)malloc(YourDesiredSize * sizeof (node));
и не забудьте освободить память.
Комментарии:
1. Да, я уверен, что это сработает, как вы заявили, но моя проблема в том, что я не уверен, каким будет размер, в таком случае, что я могу использовать?
2. тогда вам придется выделять память «на лету». Определите свой s как указатель и используйте malloc, чтобы выделить столько, сколько вам нужно.
3. Не учитывает входные данные или тот факт, что C , очевидно, является целью с учетом включения.
Ответ №2:
for(i=0;i<4;i )
{
struct node s[i];
}
Здесь вы создаете массив узлов внутри цикла for . Это локально и доступно только в цикле for . Кроме того, это не будет компилироваться так, как написано, потому что i не является постоянным выражением. Даже если бы вы использовали оператор new для выделения массива, как и раньше, он был бы доступен только в цикле for .
Вместо этого вы должны объявить свой массив где-то в другом месте :
node s[4];
Это создаст массив размером 4 путем вызова c’tor узла по умолчанию. Тогда ваш код должен работать.
Комментарии:
1.Да, я уверен, что это сработает, как вы заявили, но моя проблема в том, что я не уверен, каким будет размер, в таком случае, что я могу использовать?
2. Вы можете использовать myNodes std::vector<узел>; Затем просто используйте методы pushback вектора для добавления элементов. Векторы имеют возможность изменять свои размеры, когда это необходимо. Кроме того, если у вас есть оценка того, насколько большим должен быть максимальный размер вектора, вы можете инициализировать его с помощью соответствующего конструктора. Наконец, имейте в виду, что когда вектор изменяет свой размер, это сложная операция.
Ответ №3:
Если вы хотите создавать экземпляры структур или классов во время выполнения, вам необходимо использовать оператор new .
struct node* n = new n[4]; // creates an array of 4 node structs
for( int i=0; i<4; i )
{
n[i]->no = i;
}
Поскольку это динамически выделяемая память, вы несете ответственность за ее освобождение, когда структуры больше не нужны.
delete[] n; // free dynamically allocated memory - the brackets are needed because this an array
Комментарии:
1. Вы должны использовать только
new
тогда, когда вам нужно, чтобы объекты выходили за пределы текущей области видимости, или когда вы создаете что-то, размер которого является переменным или очень большим; используйте автоматические переменные, когда можете. Если вы используете динамическое распределение, лучше всего использовать классы управления ресурсами, такие как интеллектуальные указатели и контейнеры, чтобы убедиться, что объекты правильно удалены — в противном случае очень легко вызвать утечки памяти.2. Абсолютно верно по всем пунктам, но, на мой взгляд, используя интеллектуальные указатели или любую другую схему управления памятью, желательно знать, что такое динамическое распределение памяти.
3. Спасибо, Хольгер, можете ли вы указать синтаксис для классов? Я попытался погуглить безрезультатно, я думаю, что я не гуглю правильные термины. Синтаксис, использующий оператор new для классов, был бы полезен
4. ну, я думаю, было бы лучше, если бы вы раздобыли книгу, в которой представлены основы c / c . В ответ на ваш вопрос, для классов нет специального синтаксиса. Классы, структуры, целые числа, двойные … являются ли типы и с помощью нового оператора вы можете динамически выделять память для типа. Итак, если node является классом, выделяющим память для одного объекта типа node, это синтаксис: node * n = новый узел ();
Ответ №4:
Это можно сделать с помощью собственного массива экземпляров (структур или классов), если вы знаете их количество, или вы можете использовать коллекции, такие как list или vector, если вы этого не знаете.
#include<iostream>
#include<list>
using namespace std;
struct node
{
int no;
node() { }
node(int i) { no = i; }
};
int main()
{
struct node * arrayOf4Nodes = new node[4];
cout << "Enter four values: ";
int i;
for(i = 0; i < 4; i ) {
cin >> arrayOf4Nodes[i].no;
}
cout << "The values are:" << endl;
for(i = 0; i < 4; i ) {
cout << arrayOf4Nodes[i].no << endl;
}
delete [] arrayOf4Nodes;
// OR for unknown lengths
cout << "Enter values ending with -1000 to exit: ";
list<node> listOfNodes;
while (true) {
cin >> i;
if (cin.eof() || i == -1000)
break;
listOfNodes.push_back(node(i));
}
cout << "The values are:" << endl;
for (node n : listOfNodes) {
cout << n.no << endl;
}
return 0;
}