Строка C++, которая может быть ПУСТОЙ

Здесь приведена соответствующая документация :

Что если вы хотите управлять навигацией из вашего корневого компонента приложения ? Вы не можете ввести NavController , потому что любые компоненты, которые являются контроллерами навигации, являются дочерними для корневого компонента, поэтому они недоступны для инъекции.

blockquote>

Но вы можете использовать Nav

import { Nav } from 'ionic-angular';

//....

export class MyApp {

@ViewChild(Nav) nav: Nav;

//...

//And inside your function 

//..

this.nav.push('Page1');

//..

7
задан Community 23 May 2017 в 12:14
поделиться

7 ответов

Если Вы хотите, чтобы тип был пустым, то сделайте его указателем. Раздайте указатели строк вместо ссылок, так как это точно, что указатели могут сделать, и ссылочный наклон. Ссылки всегда указывают на тот же доступный объект. Указатели могут быть установлены в NULL или переустановлены для указания на другой объект. Таким образом при необходимости в вещах, указатели могут сделать, использовать указатели.

С другой стороны, повышение использования:: дополнительный, то, которое позволяет более безопасному с точки зрения типов способу указать "эту переменную, может или не может содержать значение".

Или, конечно, измените семантику так Вы или используйте пустые строки вместо пустого указателя, передайте отдельный bool параметр, указывающий, доступна ли строка или нет, или осуществите рефакторинг так, Вам не нужно это во-первых.

20
ответ дан 6 December 2019 в 04:51
поделиться

Перегрузка функции к спасению...

void foo( const std::string& input )
{
    std::cout << input << std::endl;

    // do more things ...
}

void foo( const char* input )
{
    if ( input != NULL ) foo( std::string(input) );
}

Это примет и массивы символов c-стиля и станд.:: строки, и подвергнутся дополнительным издержкам на стеке, если Вы передадите в строковом литерале или массиве символов, но позволяет Вам сохранять свою реализацию в одном месте и сохранять Ваш хороший синтаксис.

11
ответ дан 6 December 2019 в 04:51
поделиться

Или, смешивая немного два предыдущих ответа:

void fooImpl( const char* input )
{
    if ( input != NULL )
        std::cout << input << std::endl;
}

void foo( const std::string& input )
{
    fooImpl(input.c_str());    
}

void foo( const char* input )
{
    fooImpl(input);
}

Тот же интерфейс, никакая копия на стеке. Вы, если Вам понравилось, могли бы встроить fooImpl также.

3
ответ дан 6 December 2019 в 04:51
поделиться

Лично, я изменил бы семантику для раздавания пустого станд.:: строки вместо ПУСТОГО УКАЗАТЕЛЯ:

void foo(const std::string& input)
{
    if (!input.empty())
        std::cout << input.size() << std::endl;
}

void bar()
{
      foo("");
}
10
ответ дан 6 December 2019 в 04:51
поделиться

Почему Вы не перегружаете функцию и не даете второй перегрузке аргумента? Затем обе перегрузки могут внутренне вызвать функцию, которая обеспечивает логику чтения и который, саму, передается указатель на std::string.

void foo_impl(string const* pstr) { … }

void foo(string const& str) {
    foo_impl(&str);
}

void foo() {
    foo_impl(0);
}
2
ответ дан 6 December 2019 в 04:51
поделиться

Абсолютно не наследуйтесь std::string. Наследование является самой трудной связью, Вы можете иметь в C++, и Вы только ищете nullability, с которым можно добраться просто const char*, перегрузки, или просто std::string * если Вы действительно хотите.

2
ответ дан 6 December 2019 в 04:51
поделиться

Что, если Вы просто используете:

void foo(const char *xinput)
{
    if (xinput == NULL) {
        // do something exceptional with this
        return;
    }
    std::string input(xinput);
    // remainder of code as usual
}

Да, это действительно подвергается дополнительному выделению и копии, и вызывание функции является более подробным, потому что необходимо использовать .c_str() в обычном случае, но это действительно дает Вам семантику, которую Вы хотите.

1
ответ дан 6 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

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