fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. struct File;
  7. struct Archive {
  8. virtual std::vector<File*> fileList() = 0;
  9. };
  10.  
  11. struct File {
  12. File(std::string name_) : name(name_) {}
  13. virtual void extract() = 0;
  14. std::string name;
  15. };
  16.  
  17. // ---- zip ----
  18. struct ZipFile;
  19. struct ZipArchive: public Archive {
  20. void extractFile(ZipFile& file);
  21. virtual std::vector<File*> fileList();
  22. };
  23.  
  24. struct ZipFile: public File {
  25. ZipArchive* archive;
  26. virtual void extract() { archive->extractFile(*this); }
  27. ZipFile(std::string name_, ZipArchive* archive_) : File(name_), archive(archive_) {}
  28. };
  29.  
  30. // had to postpone it to have ZipFile defined
  31. void ZipArchive::extractFile(ZipFile& file) {
  32. cout << "Extracting file " << file.name << " from zip archive " << endl;
  33. }
  34. std::vector<File*> ZipArchive::fileList() {
  35. // memory leak here for simplicity
  36. return std::vector<File*>(1, new ZipFile("test", this));
  37. }
  38.  
  39. // ---- tar ----
  40. struct TarFile;
  41. struct TarArchive: public Archive {
  42. void extractFile(TarFile& file);
  43. virtual std::vector<File*> fileList();
  44. };
  45.  
  46. struct TarFile: public File {
  47. TarArchive* archive;
  48. virtual void extract() { archive->extractFile(*this); }
  49. TarFile(std::string name_, TarArchive* archive_) : File(name_), archive(archive_) {}
  50. };
  51.  
  52. // had to postpone it to have ZipFile defined
  53. void TarArchive::extractFile(TarFile& file) {
  54. cout << "Extracting file " << file.name << " from tar archive " << endl;
  55. }
  56. std::vector<File*> TarArchive::fileList() {
  57. // memory leak here for simplicity
  58. return std::vector<File*>(1, new TarFile("test-tar", this));
  59. }
  60.  
  61. int main() {
  62. ZipArchive archive;
  63. archive.fileList()[0]->extract();
  64.  
  65. TarArchive archive2;
  66. archive2.fileList()[0]->extract();
  67. return 0;
  68. }
Success #stdin #stdout 0s 3276KB
stdin
Standard input is empty
stdout
Extracting file test from zip archive 
Extracting file test-tar from tar archive