создание нескольких объектов для классов / структур? - PullRequest
0 голосов
/ 06 октября 2011

У меня есть вопрос.Можно ли создать несколько объектов во время выполнения для классов или структур?

#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;
}

Я пробовал описанный выше метод, но безуспешно.Любая помощь будет оценена

Ответы [ 4 ]

4 голосов
/ 06 октября 2011

замените

for(i=0;i<4;i++)
{
       struct node s[i];
}

на

 struct node s[4];

способ, которым вы написали свою программу, не будет работать.Вы определили массив узлов внутри блока, поэтому он не будет виден за пределами этого блока.

Если вы хотите динамически распределять память, вам нужно сделать что-то вроде:

 struct node *s = new node[YourDesiredSize];

или если вам нравится стиль c (не рекомендуется):

 struct node *s;
 s = (node*)malloc(YourDesiredSize * sizeof (node));

и не забудьте освободить память.

1 голос
/ 06 октября 2011

Если вы хотите создать экземпляры структур или классов в время выполнения , вам нужно использовать оператор 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 голос
/ 06 октября 2011
for(i=0;i<4;i++)
{
 struct node s[i];
}

Здесь вы создаете массив узлов внутри цикла for.Это локально и доступно только в цикле for.Кроме того, это не скомпилируется так, как написано, потому что я не является константным выражением.Тем не менее, даже если вы использовали оператор new для выделения массива, как и раньше, он будет доступен только в цикле for.

Вместо этого вы должны объявить свой массив где-то еще:

 node s[4];

Это будетсоздайте массив размером 4, вызвав c'or по умолчанию для узла.Тогда ваш код должен работать.

0 голосов
/ 17 марта 2017

Это может быть сделано с собственным массивом экземпляров (структур или классов), если вы знаете их количество, или вы можете использовать коллекции, такие как 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;
}
...