C ++: ссылки на указатели, смешанные с векторами.У меня проблемы с этим - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок в программировании, но изучил некоторые 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...