Общий доступ к переменным Ptr и объектно-ориентированное программирование для новичков - PullRequest
1 голос
/ 28 апреля 2011

Мне нужен совет, потому что я новичок в c ++

Для моей программы анализа ветряных турбин я разделил ее на различные объекты, которые выполняют определенные задачи.

Один объект обрабатывает ввод файла/ output, и в моем хлопотном случае я читаю из файла, чтобы получить данные, и эти данные заполняются массивом объектов, называемых блейдами, каждый из которых содержит массивы таких вещей, как напряжения и координаты, все связанные с каждым блейдом.

Другая задача - постобработка, и я хочу, чтобы этот пост-про-объект мог манипулировать данными блейдов.

Итак, мой главный экземпляр объекта post-pro, который запускает объект ввода / вывода и говорит ему прочитать данные в массив объектов Blade.Пока все хорошо, теперь я хочу вернуть заполненный массив объектов лезвия обратно в post-pro, чтобы я мог с ним кое-что сделать.

Это приводит к моему вопросу, но я сначала задам вопрос 0:

0: этот способ работы с объектами звучит правильно?

И реальный вопрос:

1: возвращение указателя массива объектов похоже на путь,и по какой-то причине мне пришло в голову, что shared_ptr - это путь.Но я не знаю синтаксис для просмотра переменных данных.Вот пример кода из класса post-pro:

void PostProcessor::start() {
        VLMio io;//input/output object
        io.loadData(theFileName);//load file
        test = std::tr1::shared_ptr<Blade>(new Blade());//start up shared ptr called test
        test = io.testReturn();//attempt to receive blade obect array into that pointer, is this correct?
        cout<<test[0].x[0]<<endl//this line is trouble? is this how I would see the first x coord on the first blade? 
    //i.e is the syntax the same as for regular object pointers?
}

Вот пример того, как могут выглядеть данные загрузки, он заполняет некоторые объекты Blade данными, которые были прочитаны из файла:

void IO::loadData() {
blades = new Blade[numberOfBlades];
blades[0].x[0] = 123;//just for example
blades[0].stress1 = 1234;//just for example
}

Я еще не разобрался, как вернуть эти блейд-объекты, но это может выглядеть примерно так:

std::tr1::shared_ptr<Blade> testReturn() {
//somehow attach a shared_ptr to the blades array pointer thing
//somehow return a shared ptr
}

В целом, это правильный способ сделать это, иКаков синтаксис для переменных-членов объектов интеллектуальных указателей, надеюсь, вы понимаете, извините, я новичок.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Если вы хотите использовать массивы с прямым циклом (как в C), вам нужно создать массив Blades, тогда как ваш код создает только один.Вам также нужно будет рассмотреть этот вопрос: Совместно используемые массивы TR1

Но вместо того, чтобы возиться со всем этим, как насчет просто вернуть std::vector<Blade> или, возможно, std::tr1::array<Blade, N>, если это будетиметь фиксированный размер?

0 голосов
/ 28 апреля 2011

Эта строка:

    test = std::tr1::shared_ptr<Blade>(new Blade());//start up shared ptr called test

не выделяет массив, поскольку вы, кажется, думаете, что он выделяет один экземпляр Blade.Массив будет выглядеть так:

    new Blade[somesize]

, но тогда вы не сможете использовать shared_ptr для хранения возвращаемого значения.Как и предполагали другие, vector<Blade>, вероятно, то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...