Перегрузка и оператор <и оператор> в том же классе

Если Вы/можете, сохраняют соединение открытым, Вы могли бы использовать экран , если Вы имеете права установить его.

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, который можно попробовать.

12
задан Nemanja Boric 9 September 2013 в 22:07
поделиться

3 ответа

Если я перегрузил оператор '>', должен ли я перегрузить оператор '<' для аргументов (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 (с использованием первого конструктора).

Если, с другой стороны,

25
ответ дан 2 December 2019 в 03:32
поделиться

Если назначение не явно требуют использования перегрузки оператора, вы также можете рассмотреть возможность использования объекта функции. Причина в том, что, вероятно, существует более одного способа сравнить два сообщения на предмет «меньше чем» (например, сравнить содержимое лексикографически, время публикации и т. Д.), И поэтому значение 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
        //...
    }
};
5
ответ дан 2 December 2019 в 03:32
поделиться

Да, вам следует ... но вы можете (и, возможно, должны) реализовать три из <, > , <= , > = с точки зрения другого. Это гарантирует их последовательное поведение. Обычно < - это тот, который другие реализованы в терминах, потому что это оператор по умолчанию, используемый в 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 . Однако выполнение этого приводит к большей сложности для клиента данного класса.

В некоторых ситуациях может быть приемлемо иметь <, > , <= ] и > = , но не == или ! = .

12
ответ дан 2 December 2019 в 03:32
поделиться
Другие вопросы по тегам:

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