Имеется:#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)
>Программеров здесь не любят, тут админы сидят!!!Для тех хто в танке и не умеет читать, название форума
"Программирование программирование под 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
>А вектор вполне нормально используется как член класса, это лбъект, а пропихивание
>объекта в другой объект никто не отменял.Спасибо. Но я уже кое-что накопал, а именно:
для того, чтобы использовать вектор как член класса надо в конструкторе инициализировать его:class cls {
std::vector<int>v;
...
}cls::cls() : v(10) {}
>>А вектор вполне нормально используется как член класса, это лбъект, а пропихивание
>>объекта в другой объект никто не отменял.
>
>Спасибо. Но я уже кое-что накопал, а именно:
>для того, чтобы использовать вектор как член класса надо в конструкторе инициализировать
>его:
>
>class cls {
>std::vector<int>v;
>...
>}
>
>cls::cls() : v(10) {}Это тоже не факт, т.к. он создаётся пустым по дефолту, а в твоём конструкторе он просто резервирует место для 10 элементов. А какие у тебя сообщения компилятора были?
P.S. DeadMustdie - пшёл вон.
>Это тоже не факт, т.к. он создаётся пустым по дефолту, а в
>твоём конструкторе он просто резервирует место для 10 элементов. А какие
>у тебя сообщения компилятора были?
>P.S. DeadMustdie - пшёл вон.cls::cls() : v(10) {}
10 - это для примера. Можно и 0
Но пока я не прописал сие в конструктор, при исполнении откомплированного файла выдавалось сообщение segmentation fault (core dump)
>>Это тоже не факт, т.к. он создаётся пустым по дефолту, а в
>>твоём конструкторе он просто резервирует место для 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.
>
>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() {}
все заработало