Я новичок в программировании, но изучил некоторые C
и Java
.
Я сейчас начинаю изучать C++
.Одним из первых заданий, которые я поручил для себя, было перевести небольшую программу, написанную на Java
, на C++
.Теперь, насколько я понимаю, Java
, кажется, использует указатели на объекты для всего, что скрыто (то, что называется в Java
"ссылочные переменные") или адреса для объектов (что называется в Java
«ссылкой»), поэтому вы не можете напрямую манипулировать объектами, как в C++
, вместо этого используя для этого «ссылку».
Из-за этого я хотелнаписать эту программу как можно ближе к этой Java-логике , используя указатели для любого объекта вместо использования самих объектов.Однако я столкнулся с проблемой при попытке использовать петли на основе диапазона (для каждого) с векторами .Единственный обходной путь, который я нашел, состоял в том, чтобы использовать традиционный цикл (обычный для) или просто отказаться от этой логики Java и использовать объекты напрямую.Однако я хочу использовать указатели, а не сами объекты.
Неужели это невозможно?Если нет, что я должен изменить в своем коде?
#include <iostream>
#include <vector>
using namespace std;
class File;
class FileGenerator {
public:
void generateFile(vector<File *> * &files);
};
class File {
public:
virtual void generate() = 0;
};
class FilePDF : public File{
public:
void generate();
};
class FileXML : public File {
public:
void generate();
};
void FileXML::generate(){
cout << "Generating XML file... " << endl;
}
void FilePDF::generate(){
cout << "Generating PDF file... " << endl;
}
void FileGenerator::generateFile(vector<File *> * &files){
///THIS WORKS FINE!
// for(int i = 0; i < files->size(); i++){
// files->at(i)->generate();
// }
///THIS DOES NOT WORK!
for(File *file : *files){
file->generate();
}
}
int main(){
vector<File *> *files = new vector<File *>;
files->push_back(new FilePDF);
files->push_back(new FileXML);
FileGenerator *fileGenerator = new FileGenerator();
fileGenerator->generateFile(files);
return 0;
}