Передача использования параметра RelayCommand, определенный в ViewModel (от примера Josh Smith)

Хотя вы уже обнаружили, что cin >> str; не требуется, поскольку вы просто снова пишете в str с помощью cin.getline (str, sizeof str), существует ряд дополнительных проблем, на которые следует обратить внимание:

] 1. [1 131] Если ваш компилятор не старый, вы должны #include <string>, а не C-заголовок string.h;

2. Не используйте магические числа в своем коде. Если вам нужна постоянная, например, для максимального количества символов в str, #define константе или используйте глобальный enum, чтобы сделать то же самое, например

#define MAXC 200    /* if you need a constant, #define one (or more) */
...
    char str[MAXC]; /* don't use 'magic-number', use a constant */

Таким образом, когда и если вы измените количество символов в str в будущем, вам не придется выбирать весь ваш код и изменять каждое вхождение магического числа [ 1120], например cin.get(str,200);.

[Тысяча сто двадцать пять] [1 133] 3. [1 133] Подтвердите КАЖДЫЙ пользовательский ввод. В противном случае неудачный ввод может установить бит ошибки в вашем входном потоке, а дополнительные попытки чтения из потока с установленным битом ошибки могут привести к неопределенному поведению. Вы можете сделать:

    if (!getline(cin,str1)) {   /* VALIDATE every input */
        cerr << "error: input failure - str1.\n";
        return 1;
    }

и

    if (cin.get (str, sizeof str))
        cout << str << endl;

( примечание: больше нет попыток чтения после cin.get (str, sizeof str), так что защитите ваше использование str достаточно)

4. Всегда выводите символ новой строки после вывода последней строки, чтобы убедиться, что ваша программа POSIX-совместима. В противном случае во многих операционных системах вы запутаете запрос пользователя при записи в stdout или создадите выходной файл, не совместимый с POSIX, если перенаправите вывод в файл, например

my cat has none01:22 wizard:~/dev/src-cpp/tmp/debug>

В целом, вы можете сделать что-то вроде:

#include <iostream>
#include <string>   /* depending on your compiler */

#define MAXC 200    /* if you need a constant, #define one (or more) */

using namespace std;

int main (void) {

    char str[MAXC]; /* don't use 'magic-number', use a constant */
    string str1;

    cout << "enter a string: ";
    if (!getline(cin,str1)) {   /* VALIDATE every input */
        cerr << "error: input failure - str1.\n";
        return 1;
    }
    cout << str1 << endl;

    cout << "enter second string: ";
    // cin >> str;  /* not needed */
    if (cin.get (str, sizeof str))
        cout << str << endl;

}

Пример использования / Вывод

$ ./bin/cin.get_getline
enter a string: my dog has fleas
my dog has fleas
enter second string: my cat has none
my cat has none
24
задан eesh 1 May 2009 в 04:37
поделиться

3 ответа

Я не понимаю, почему у вас есть дополнительная сложность определения лямбды в первую очередь. Почему бы просто не сделать это:

if (_aCommandWithAParameter == null)
{           
    _aCommandWithAParameter = new RelayCommand<object>(CommandWithAParameter);
}

private void CommandWithAParameter(object state)
{
    var str = state as string;
}
30
ответ дан 28 November 2019 в 22:56
поделиться

Вы передадите параметр в лямбде команде, как :

if (_aCommandWithAParameter == null)
{           
    _aCommandWithAParameter = new RelayCommand(               
        param => this.CommandWithAParameter(param)
        );        
}
13
ответ дан 28 November 2019 в 22:56
поделиться

Я не могу заменить ссылку на имя метода для выражения lamda из-за ошибки компиляции. Очевидно, и это не удивительно, что ссылка на имя нестатического метода не может использоваться вместо лямбды. Я не воспринимаю это как «дополнительную сложность». Для меня имеет смысл постоянно передавать ламды.

1
ответ дан 28 November 2019 в 22:56
поделиться
Другие вопросы по тегам:

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