Если Вы/можете, сохраняют соединение открытым, Вы могли бы использовать экран , если Вы имеете права установить его.
user@localhost $ screen -t remote-command
user@localhost $ ssh user@target # now inside of a screen session
user@remotehost $ cd /some/directory; program-to-execute &
Для отсоединения экранной сессии: ctrl-a d
Для списка экранных сессий:
screen -ls
Для повторного прикрепления сессии:
screen -d -r remote-command
Примечание, что экран может также создать несколько оболочек в каждой сессии. Подобный эффект может быть достигнут с tmux.
user@localhost $ tmux
user@localhost $ ssh user@target # now inside of a tmux session
user@remotehost $ cd /some/directory; program-to-execute &
Для отсоединения tmux сессии: ctrl-b d
Для списка экранных сессий:
tmux list-sessions
Для повторного прикрепления сессии:
tmux attach
значение по умолчанию tmux клавиша CTRL, ' ctrl-b ', несколько трудно использовать, но существует несколько примеров tmux конфигурации, которые поставлются с tmux, который можно попробовать.
Если я перегрузил оператор '>', должен ли я перегрузить оператор '<' для аргументов (const Message &, const Message &)?
Да. Фактически, в большинстве программ принято предпочитать использование <
перед >
(не спрашивайте меня, почему, вероятно, историческое). Но в более общем плане всегда перегружайте полный набор связанных операторов; в вашем случае это, вероятно, также будет ==
, ! =
, <=
и > =
.
(Имеет ли следующий код вызывает operator> для объекта message1 или operator
Он всегда вызывает то, что находит в коде. Для компилятора C ++ нет абсолютно никакой связи между >
и <
. Для нас, они выглядят одинаково, но компилятор видит два совершенно разных, не связанных между собой символа. Таким образом, нет двусмысленности: компилятор вызывает то, что видит.
Нужно ли это объявлять как функцию-член?
Нет. Фактически, ее лучше не объявлять как функцию-член. Объявление его как функции-члена означает, что первый аргумент (то есть левая часть выражения) действительно должен быть объектом Message
, а не объектом, который неявно преобразуется в Message
.
Чтобы понять это, рассмотрим следующий случай:
struct RealFraction {
RealFraction(int x) { this.num = x; this.den = 1; }
RealFraction(int num, int den) { normalize(num, den); }
// Rest of code omitted.
bool operator <(RealFraction const& rhs) {
return num * rhs.den < den * rhs.num;
}
};
Теперь вы можете написать следующее сравнение:
int x = 1;
RealFraction y = 2;
if (y < x) …
но вы не можете написать следующее:
if (x < y) …
хотя существует неявное преобразование из int
в RealFraction
(с использованием первого конструктора).
Если, с другой стороны,
Если назначение не явно требуют использования перегрузки оператора, вы также можете рассмотреть возможность использования объекта функции. Причина в том, что, вероятно, существует более одного способа сравнить два сообщения на предмет «меньше чем» (например, сравнить содержимое лексикографически, время публикации и т. Д.), И поэтому значение operator <
интуитивно неясно .
С std :: priority_queue
используемый объект функции указан в качестве третьего параметра шаблона (к сожалению, вам также потребуется указать второй - базовый тип контейнера):
#include <queue>
#include <string>
#include <functional>
#include <vector>
class Message
{
int priority;
std::string contents;
//...
public:
Message(int priority, const std::string msg):
priority(priority),
contents(msg)
{}
int get_priority() const { return priority; }
//...
};
struct ComparePriority:
std::binary_function<Message, Message, bool> //this is just to be nice
{
bool operator()(const Message& a, const Message& b) const
{
return a.get_priority() < b.get_priority();
}
};
int main()
{
typedef std::priority_queue<Message, std::vector<Message>, ComparePriority> MessageQueue;
MessageQueue my_messages;
my_messages.push(Message(10, "Come at once"));
}
При реализации вашей собственной очереди приоритетов вы можете сделать это в следующим образом:
class MessageQueue
{
std::vector<Message> messages;
ComparePriority compare;
//...
void push(const Message& msg)
{
//...
if (compare(msg, messages[x])) //msg has lower priority
//...
}
};
Да, вам следует ... но вы можете (и, возможно, должны) реализовать три из <
, >
, <=
, > =
с точки зрения другого. Это гарантирует их последовательное поведение. Обычно <
- это тот, который другие реализованы в терминах, потому что это оператор по умолчанию, используемый в set
s и map
s.
Например, если вы реализовали <
, вы можете определить >
, <=
и > =
вот так.
inline bool operator>(const Message& lhs, const Message& rhs)
{
return rhs < lhs;
}
inline bool operator<=(const Message& lhs, const Message& rhs)
{
return !(rhs < lhs);
}
inline bool operator>=(const Message& lhs, const Message& rhs)
{
return !(lhs < rhs);
}
==
и ! =
часто реализуются отдельно. Иногда классы реализуют ==
так, что a == b
тогда и только тогда, когда ! (A , но иногда
==
реализуется как более строгая связь, чем ! (a . Однако выполнение этого приводит к большей сложности для клиента данного класса.
В некоторых ситуациях может быть приемлемо иметь <
, >
, <=
] и > =
, но не ==
или ! =
.