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;
}
С помощью оператора 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;
}
Если вы хотите сделать глубокую копию, вы, конечно, Также необходимо выделить новую память для хранения значений. Если у оригинала есть указатель на int, и вы не хотите, чтобы копия использовала то же значение указателя, вы должны выделить новую память для хранения int, а затем скопировать туда значение.
Ваш пример не очень ясно, это не
Я недавно обнаружил, что когда я есть указатели в классе, мне нужно указать конструктор Copy.
Это не совсем так. Если у вас есть указатели в вашем классе и вы выделите память, используя new
, тогда вам придется беспокоиться о конструкторе копирования. Также не забудьте оператор присваивания и деструктор.
Вы должны удалить выделенную память, используя delete
.
Это называется Закон Большой Тройки .
Пример:
~Matrix(); //Destructor
Matrix(const Matrix& m); //Copy constructor
Matrix& operator= (const Matrix& m); //Assignment operator
Я недавно обнаружил, что когда я есть указатели в классе, мне нужно указать конструктор Copy
Чаще всего хорошей идеей будет просто отключить его, объявив его (и оператор присваивания) закрытым, а не реализовав его.
, если у него есть указатель на обычный тип, то
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);
}
Ваша проблема в этой строке прямо здесь:
*pointer = a;
Все вещи, которые обычно это происходит в вашем конструкторе по умолчанию еще не произошло, в том числе выделение памяти для указателя *
.
Исправление состоит в том, чтобы выделить память для целого числа. Для этого вы можете использовать malloc
и друзей или new
, но убедитесь, что это тот же метод, который вы используете в конструкторе по умолчанию, потому что вы получаете только один деструктор, и вызовы должны совпадать .
Если для члена (мелкая) копия в порядке, то вам не нужно ничего делать. Если вам нужна глубокая копия, вы должны выделить новое хранилище для копий всех участников.
При написании конструктора копирования вы должны выделить память для всех членов. В вашем случае:
TRY::TRY(TRY const & copyTRY){
pointer = new int(*(copyTry.pointer));
}
Оператор = чем-то похож, но без выделения памяти.
TRY& operator=(TRY const& otherTRY){
this->a = *(otherTry.pointer)
return *this
}
Чаще всего, если вам нужно написать конструктор копирования или оператор присваивания, вы делаете что-то не так. Оставьте конструкторы копирования и операторы присваивания разработчикам стандартной библиотеки. Составьте свои классы уже копируемых и присваиваемых элементов, и вам не придется писать свои собственные.
Например, может быть, вместо этого элемент int * должен быть std :: vector.
Если вы не можете сделать класс по умолчанию копируемый / назначаемый, возможно, вы можете сделать его не подлежащим копированию / назначению, объявив, но не реализовав, частный конструктор копирования и оператор присваивания.
Только если ничего из перечисленного не выполнимо, вы должны реализовать свой собственный конструктор копирования. или оператор присваивания.