Есть ли способ проверить, безопасно ли копировать или назначать объект в C ++? - PullRequest
1 голос
/ 26 ноября 2010

У меня следующая проблема. Я использую библиотеку C igraph (http://igraph.sourceforge.net/) в программе, которую я должен сделать на c ++. Поэтому я нашел оболочку c ++ этой библиотеки C (http://code.google.com/p/igraphhpp/), которая предоставляет некоторый хороший интерфейс, который я хотел использовать, в классе под названием Graph .

В моей программе есть следующий класс:

class Agent 
{
private: 
  double beta;  
  Graph * innerGraph;
public:
  Agent(int N, double beta_) {
    innerGraph = new Graph;
    *innerGraph = Graph::full(N);
    beta = beta_;
  };
  ~Agent() {delete innerGraph;}
  void MCStep();
};

Функция MCStep () должна выполнять следующие действия:

  • сделать копию Графа, содержащегося в *innerGraph,
  • сделать что-нибудь с этой копией, не изменяя оригинал,
  • проверьте, удовлетворяет ли измененная копия некоторому условию, и, если да, обновите *innerGraph этим новым измененным графом.

Если бы я знал, что в библиотеке реализован безопасный конструктор копирования, я бы сделал это очевидным образом, но я не знаю. Как я могу это проверить?

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Проверьте источник Graph, посмотрите, вызывает ли конструктор копирования эту функцию:

http://igraph.sourceforge.net/doc/html/ch04s02s01.html#igraph_copy

Нет общего пути - сам язык C ++ ничего не знает о «глубоких копиях» или «неглубоких копиях», поэтому конструкторы копирования для него одинаковы. В идеальном мире любой, кто публикует оболочку C ++, подобную этой, задокументирует ее, и в этом случае, вероятно, должен сделать ее полной глубокой копией.

1 голос
/ 26 ноября 2010

Поскольку вы работаете с указателями на Graph, не можете ли вы просто поменять указатели на шаге 3? (Не забудьте удалить временный после свопинга)

...