Присвоение значений по умолчанию аргументам, передаваемым по ссылке - PullRequest
1 голос
/ 09 февраля 2012

Я хочу сделать что-то вроде этого:

int displayAll(Message *m, string &lastIndex, int &NumPrinted = 0 );

выдает ошибку, перебрасывая int на int &.

Я тоже это пробовал:

int temp =0;

int displayAll(Message *m, string &lastIndex, int &NumPrinted = temp );

Все равно выдает следующую ошибку:

error: ISO C++ forbids in-class initialization of non-const static member 'temp'

Четный static int temp; дает ошибку.

ошибка: ISO C ++ запрещает инициализацию в классе неконстантного статического члена 'temp'

Ответы [ 3 ]

1 голос
/ 09 февраля 2012

Проблема с первой строкой кода, которую вы упоминаете, заключается в том, что вы пытаетесь передать ссылку на временную переменную

class Foo {

    int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted = 0 );

};

Второй бит кода жалуется, потому что вы пытались инициализировать члена классастатически.

class Foo {

    int temp =0;

    int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted = temp );

};

(я помещаю ваш код в объявление класса, чтобы было ясно, что происходит).

Простой выход из вашей проблемы, который не вводит статическийПеременная явная перегрузка функции:

class Foo {

    inline int displayAll(Message *m, bool &moreElements, string &lastIndex) {
        int dummy = 0;
        return displayAll(m, moreElements, lastIndex, dummy);
    }
    int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted);

};

Есть немного шаблонного, но он достигает того, что вы хотите.Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Еще несколько уточнений.Суть проблемы заключается в том, что функция должна ссылаться на некоторую память, которую она может изменить.Если вы передаете ему временную переменную (временную, как в значении этого термина в C ++, а не только в английском языке) (как в первой строке кода), это недопустимый C ++, поскольку вы обычно копируете временную переменную в значение передиспользуйте его в качестве аргумента функции:

void bar( int someNum = 0 ); // think of this as creating a temporary rvalue 0
                             // and then copying it into the function for use.

// temporary rvalues arise in expressions like
int v = 5 + 5; // the result of 5 + 5 is stored in a temporary rvalue, and then
               // copied into v (which is an lvalue in this case).

Так что нам нужно что-то, что является "lvalue", либо где-то глобальной переменной, либо временной локальной переменной (на английском языке)смысл) как я дал в своем ответе.Я собирался написать решение с использованием статической переменной, но есть большой недостаток - поскольку статическая переменная будет совместно использоваться всеми экземплярами вашего класса, она будет начинаться с 0, а затем будет отличаться при каждом вызове метода (так какэто было бы отредактировано предыдущим вызовом).Хуже того, в случае нескольких потоков вы будете читать / записывать в одно и то же место памяти от нескольких процессоров, так что значение будет полным мусором, и вы будете изнасиловать кэш-память своих процессорных ядер, поскольку каждая запись приведет к аннулированию кэшакаждого другого ядра.Это некрасиво, пожалуйста, не делай этого.: P

Используя мое первое решение, вы делаете временную переменную очень локальной, без какого-либо влияния на что-либо еще.

0 голосов
/ 09 февраля 2012

Я тоже нашел этот интересный способ добиться этого:

class demo {
public:
        void displayAll(int &x, int y = 0 ) {
            int *p;
            if(y)
                p = (int*)y;
            if(p) *p = 10;

        x = 4;
    }
};


int main() {
    int x=0, y=0;
    demo *obj = new demo();
    obj->displayAll((x);
    //obj->temp(x,(int)&y);
    cout << "\n x= " << x << " y " << y;
    return 0;
}
0 голосов
/ 09 февраля 2012

Вы не можете сделать это для неконстантной ссылки, пока не объявите temp равным static: см. this stackoverflow post.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...