Tôi muốn lưu trữ các đối tượng của các lớp bắt nguồn từ một giao diện chung (lớp trừu tượng) trong một std :: vector của lớp trừu tượng đó. Vector này nên được điền vào một vòng lặp và thường tôi sẽ gọi hàm tạo của một lớp và đẩy đối tượng đã tạo vào vectơ.Thêm các phần tử vào std :: vector của lớp trừu tượng
Như tôi đã hiểu, trong trường hợp của một lớp trừu tượng, tôi chỉ có thể lưu trữ con trỏ đến lớp đó, vì vậy tôi cần phải push_back con trỏ của các lớp dẫn xuất. Tuy nhiên, tôi không chắc chắn về phạm vi của các đối tượng mới được tạo ra này.
Vui lòng xem mã bên dưới. Mã này biên dịch và hoạt động tốt nhưng câu hỏi của tôi là:
a) Các đối tượng có được bảo đảm tồn tại trong vòng lặp thứ hai trong chức năng chính không? Hoặc họ có thể ngừng tồn tại vượt quá phạm vi của vòng lặp mà chúng được tạo ra không?
b) Có phải tất cả các đối tượng hủy hoại được gọi là hoặc có thể có rò rỉ bộ nhớ không?
#include<vector>
#include<iostream>
class Interface {
public:
Interface(int y) : x(y) {}
virtual ~Interface() {}
virtual void f() = 0;
int x;
};
class Derived_A : public Interface {
public:
Derived_A(int y) : Interface(y) {}
void f(){ return; }
};
class Derived_B : public Interface {
public:
Derived_B(int y) : Interface(y) {}
void f(){ return; }
};
int main()
{
std::vector<Interface*> abstractObjects;
int N = 5;
for(int ii = 0; ii < N; ii++)
{
abstractObjects.push_back(new Derived_A(ii));
abstractObjects.push_back(new Derived_B(ii));
}
for(int ii = 0; ii < abstractObjects.size(); ii++)
{
abstractObjects[ii]->f();
std::cout << abstractObjects[ii]->x << '\t' << std::endl;
}
for(int ii = 0; ii < abstractObjects.size(); ii++)
{
delete abstractObjects[ii];
}
return 0;
}
Nếu sử dụng C++ 14 thì tại sao không cho vòng lặp phạm vi? – Slava
@Slava Cảm ơn bạn đã đề xuất. Tôi đã chỉnh sửa mã. – NathanOliver
Cảm ơn! Điều gì sẽ xảy ra nếu tôi có một hàm 'f2()' tạo ra vectơ như bạn gợi ý và sau đó tạo một đối tượng 'Obj (std :: vector>)' bằng cách sử dụng vectơ chính xác này và trả về 'Obj này 'từ chức năng? Liệu vectơ (và các phần tử của nó) vẫn tồn tại trong hàm gọi là 'f2() '? –
seyfe