Скопируйте конструктора с указателями

Cytoscape.js предоставляет несколько удобных функций для фильтрации узлов:

var cy = (window.cy = cytoscape({
  container: document.getElementById("cy"),

  boxSelectionEnabled: false,
  autounselectify: true,

  style: [{
      selector: "node",
      css: {
        content: "data(id)",
        "text-valign": "center",
        "text-halign": "center",
        height: "60px",
        width: "100px",
        shape: "rectangle",
        "background-color": "data(faveColor)"
      }
    },
    {
      selector: "edge",
      css: {
        "curve-style": "bezier",
        "control-point-step-size": 40,
        "target-arrow-shape": "triangle"
      }
    }
  ],

  elements: {
    nodes: [{
        data: {
          id: "Top",
          faveColor: "#2763c4"
        }
      },
      {
        data: {
          id: "yes",
          faveColor: "#37a32d"
        }
      },
      {
        data: {
          id: "no",
          faveColor: "#2763c4"
        }
      },
      {
        data: {
          id: "Third",
          faveColor: "#2763c4"
        }
      },
      {
        data: {
          id: "Fourth",
          faveColor: "#56a9f7"
        }
      }
    ],
    edges: [{
        data: {
          source: "Top",
          target: "yes"
        }
      },
      {
        data: {
          source: "Top",
          target: "no"
        }
      },
      {
        data: {
          source: "no",
          target: "Third"
        }
      },
      {
        data: {
          source: "Third",
          target: "Fourth"
        }
      }
    ]
  },
  layout: {
    name: "dagre"
  }
}));

cy.unbind('click');
cy.bind('click', 'node', function(node) {
  console.log(node.target.predecessors().edges());
  node.target.predecessors().edges().animate({
    style: {
      lineColor: "red"
    }
  });
});
body {
  font: 14px helvetica neue, helvetica, arial, sans-serif;
}

#cy {
  height: 100%;
  width: 100%;
  left: 0;
  top: 0;
  float: left;
  position: absolute;
}



  
  
  
  
  
  



  

15
задан Saurav Sahu 4 September 2017 в 02:55
поделиться

9 ответов

С помощью оператора int * pointer вы только что определили указатель, но не выделили никакой памяти. Во-первых, вы должны указать ему правильную область памяти, выделив некоторую память следующим образом: int * pointer = new int . Затем в конструкторе копирования снова необходимо выделить память для скопированного объекта. Кроме того, не забудьте освободить память, используя delete в деструкторе.

Я надеюсь, что этот пример поможет:

class B
{

public:
    B();
    B(const B& b);
    ~B();
    void setVal(int val);

private:
    int* m_p;
};

B::B() 
{
    //Allocate the memory to hold an int
    m_p = new int;

    *m_p = 0;
}

B::B(const B& b)
{
    //Allocate the memory first
    m_p = new int;

    //Then copy the value from the passed object
    *m_p = *b.m_p;
}

B::~B()
{

    //Release the memory allocated
    delete m_p;
    m_p = NULL;
}

void B::setVal(int val)
{
    *m_p = val;
}
18
ответ дан 1 December 2019 в 01:39
поделиться

Если вы хотите сделать глубокую копию, вы, конечно, Также необходимо выделить новую память для хранения значений. Если у оригинала есть указатель на int, и вы не хотите, чтобы копия использовала то же значение указателя, вы должны выделить новую память для хранения int, а затем скопировать туда значение.

Ваш пример не очень ясно, это не

3
ответ дан 1 December 2019 в 01:39
поделиться

Я недавно обнаружил, что когда я есть указатели в классе, мне нужно указать конструктор Copy.

Это не совсем так. Если у вас есть указатели в вашем классе и вы выделите память, используя new , тогда вам придется беспокоиться о конструкторе копирования. Также не забудьте оператор присваивания и деструктор. Вы должны удалить выделенную память, используя delete .

Это называется Закон Большой Тройки .

Пример:

  ~Matrix();  //Destructor
  Matrix(const Matrix& m); //Copy constructor
  Matrix& operator= (const Matrix& m); //Assignment operator
9
ответ дан 1 December 2019 в 01:39
поделиться

Я недавно обнаружил, что когда я есть указатели в классе, мне нужно указать конструктор Copy

Чаще всего хорошей идеей будет просто отключить его, объявив его (и оператор присваивания) закрытым, а не реализовав его.

2
ответ дан 1 December 2019 в 01:39
поделиться

, если у него есть указатель на обычный тип, то

A::A(const A& a):
  pointer_( new int( *a.pointer_ ) )
{
}

, если у него есть указатель на некоторый базовый класс, тогда

A::A(const &a ):
  pointer_( a.pointer_->clone() )
{
}

Clone является реализацией шаблона прототипа

Не забудьте удалить указатель в деструкторе

A::~A()
{
    delete pointer_;
}

. Чтобы исправить ваш пример

TRY::TRY(TRY const & copyTRY){
    int a = *copyTRY.pointer;
    pointer = new int(a);
}
1
ответ дан 1 December 2019 в 01:39
поделиться

Ваша проблема в этой строке прямо здесь:

    *pointer = a;

Все вещи, которые обычно это происходит в вашем конструкторе по умолчанию еще не произошло, в том числе выделение памяти для указателя * .

Исправление состоит в том, чтобы выделить память для целого числа. Для этого вы можете использовать malloc и друзей или new , но убедитесь, что это тот же метод, который вы используете в конструкторе по умолчанию, потому что вы получаете только один деструктор, и вызовы должны совпадать .

1
ответ дан 1 December 2019 в 01:39
поделиться

Если для члена (мелкая) копия в порядке, то вам не нужно ничего делать. Если вам нужна глубокая копия, вы должны выделить новое хранилище для копий всех участников.

1
ответ дан 1 December 2019 в 01:39
поделиться

При написании конструктора копирования вы должны выделить память для всех членов. В вашем случае:

TRY::TRY(TRY const & copyTRY){
    pointer = new int(*(copyTry.pointer));
}

Оператор = чем-то похож, но без выделения памяти.

TRY& operator=(TRY const& otherTRY){
      this->a  = *(otherTry.pointer)
      return *this
}
0
ответ дан 1 December 2019 в 01:39
поделиться

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

Например, может быть, вместо этого элемент int * должен быть std :: vector.

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

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

-1
ответ дан 1 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

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