Передача интеллектуального указателя как аргумент в классе: scoped_ptr или shared_ptr?

Вы можете установить поднабор x, когда в сэмпле будет достигнуто значение 40 «Outs». Попробуйте изменить свою функцию на

Player = function(n) {
    x = sample(c("Out","Base"), n , prob = c(.68,.32) ,replace = TRUE)
    inds <- cumsum(x == "Out") >= 40
    if (any(inds)) 
      x <- x[1:which.max(inds)]
    hit_sum = sum(x =="Base")*.20
    out_sum = sum(x =="Out")
    return(hit_sum)
}
5
задан Edison Gustavo Muenz 17 March 2009 в 18:13
поделиться

5 ответов

Используйте здесь простой станд.:: auto_ptr, поскольку Вы не можете создать объекты на стеке. И это лучше к Вашей закрытой функции, просто принимают необработанный указатель.

Реальное использование состоит в том, что Вы не должны ловить все возможные исключения и делать руководство удаляет.

На самом деле, если Ваш объект, не изменяет объект и Ваш эхо-сигнал API наверняка, Вы были бы лучше для использования

void privateMethod1(const Foo& fooObj);

и передайте объект туда как

privateMethod1(*fooObj.get());
1
ответ дан 14 December 2019 в 04:48
поделиться

Одна дальнейшая возможность состоит в том, чтобы создать объект как static_ptr для простоты управления памятью, но просто передать необработанный указатель на другие закрытые методы:

void privateMethod1(Foo *fooObj);

void showSomethingOnTheScreen() {
  scoped_ptr<Foo> fooObj(new Foo);
  privateMethod1(fooObj.get());
};
3
ответ дан 14 December 2019 в 04:48
поделиться

Я использовал бы scoped_ptr внутри showSomethingOnTheScreen, но передал бы необработанный указатель (или ссылка) к privateMethod1, например.

scoped_ptr <Нечто> fooObj (новый Foo);
privateMethod1 (fooObj.get ());

3
ответ дан 14 December 2019 в 04:48
поделиться

Я подозрителен о комментарии, "он пользуется библиотекой, которая не позволяет объекты на стеке, они должны быть на "куче"".

Почему? Это обычно означает, что они должны быть освобождены некоторым специальным способом - поэтому, возможно, ни одно из этих решений не будет работать.

1
ответ дан 14 December 2019 в 04:48
поделиться

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

class A {
   private:
      void privateMethod1(Foo& fooObj);

   public:
      void showSomethingOnTheScreen() {
          scoped_ptr<Foo> fooObj(new Foo);
          privateMethod1(*(fooObj.get()));
      };
};
0
ответ дан 14 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: