URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4432
[ Назад ]

Исходное сообщение
"Можно ли использовать вектор как член класса?"

Отправлено sandy , 04-Июл-05 01:07 
Имеется:

#include <vector>

struct str {
...
};

class cls {
std::vector<str>v(10);
...
};

void cls::f()
{
v.resize(v.size()+1)
...
}

Ругается следующим образом:
invalid data member initialization
(use `=' to initialise static data members)

Если пробую объявить этот член так:
std::vector<str>v;
не ругается, компилируется. Но - segmentation fault (core dump)


Содержание

Сообщения в этом обсуждении
"Можно ли использовать вектор как член класса?"
Отправлено naquad , 04-Июл-05 12:56 
>Программеров здесь не любят, тут админы сидят!!!

Для тех хто в танке и не умеет читать, название форума
"Программирование программирование под UNIX".
Так что кто, кого, где, как и куда любит - уточнять не будем.
А вектор вполне нормально используется как член класса, это лбъект, а пропихивание объекта в другой объект никто не отменял.
Простенький пример:
  1 #include <vector>
  2 #include <iostream>
  3 using namespace std;
  4 typedef vector<int> InTvector;//для удобства
  5
  6 class TheTest{
  7         InTvector x;
  8 public:
  9         void add(int val){
10                 x.push_back(val);
11         }
12         int get(){
13                 return x[0];
14         }
15         void pop(){
16                 x.erase(x.begin());
17         }
18         void clear(){
19                 x.clear();
20         }
21 };
22
23 int main(int argc,char* argv[]){
24         TheTest test;
25         test.add(1);
26         test.add(2);
27         cout<<"First is: "<<test.get()<<endl;
28         test.pop();
29         cout<<"After POP operation first is : "<<test.get()<<endl;
30         test.clear();
31         return 0;
32 }

[root@TheNaquad tests]# g++ vect.cpp -o vect
[root@TheNaquad tests]# ./vect
First is: 1
After POP operation first is : 2


"Можно ли использовать вектор как член класса?"
Отправлено sandy , 05-Июл-05 13:57 
>А вектор вполне нормально используется как член класса, это лбъект, а пропихивание
>объекта в другой объект никто не отменял.

Спасибо. Но я уже кое-что накопал, а именно:
для того, чтобы использовать вектор как член класса надо в конструкторе инициализировать его:

class cls {
std::vector<int>v;
...
}

cls::cls() : v(10) {}


"Можно ли использовать вектор как член класса?"
Отправлено naquad , 05-Июл-05 16:00 
>>А вектор вполне нормально используется как член класса, это лбъект, а пропихивание
>>объекта в другой объект никто не отменял.
>
>Спасибо. Но я уже кое-что накопал, а именно:
>для того, чтобы использовать вектор как член класса надо в конструкторе инициализировать
>его:
>
>class cls {
>std::vector<int>v;
>...
>}
>
>cls::cls() : v(10) {}

Это тоже не факт, т.к. он создаётся пустым по дефолту, а в твоём конструкторе он просто резервирует место для 10 элементов. А какие у тебя сообщения компилятора были?
P.S. DeadMustdie - пшёл вон.


"Можно ли использовать вектор как член класса?"
Отправлено sandy , 05-Июл-05 23:10 
>Это тоже не факт, т.к. он создаётся пустым по дефолту, а в
>твоём конструкторе он просто резервирует место для 10 элементов. А какие
>у тебя сообщения компилятора были?
>P.S. DeadMustdie - пшёл вон.

cls::cls() : v(10) {}
10 - это для примера. Можно и 0
Но пока я не прописал сие в конструктор, при исполнении откомплированного файла выдавалось сообщение segmentation fault (core dump)


"Можно ли использовать вектор как член класса?"
Отправлено Lazarenko , 06-Июл-05 01:34 
>>Это тоже не факт, т.к. он создаётся пустым по дефолту, а в
>>твоём конструкторе он просто резервирует место для 10 элементов. А какие
>>у тебя сообщения компилятора были?
>>P.S. DeadMustdie - пшёл вон.
>
>cls::cls() : v(10) {}
>10 - это для примера. Можно и 0
>Но пока я не прописал сие в конструктор, при исполнении откомплированного файла
>выдавалось сообщение segmentation fault (core dump)

Dear sir! If you will not initialize aggregated vector<T> class, compiler will do it for you by calling default constructor. I.e. if you will write:

Ctr::Ctr()
{
}

then compiler will generate:

Ctr::Ctr() : aggVector()
{
}

So, if you got segmentation fault, then try to debug your application and see what really happens. All code you wrote below is clear.


"Можно ли использовать вектор как член класса?"
Отправлено sandy , 06-Июл-05 12:12 
>
>Dear sir! If you will not initialize aggregated vector<T> class, compiler will do it for you by calling default constructor. I.e. if you will write:
>
>Ctr::Ctr()
>{
>}
>
>then compiler will generate:
>
>Ctr::Ctr() : aggVector()
>{
>}
>
>So, if you got segmentation fault, then try to debug your application
>and see what really happens. All code you wrote below is
>clear.

Segmentation fault генерировался при исполнении кода aggVector.resize(aggVector.size()+1)
Когда конструктор был переписан:
Ctr::Ctr() : aggVector() {}
все заработало