Параметры по умолчанию (c++)

Модератор: Модераторы разделов

Аватара пользователя
KislotLord
Сообщения: 68

Параметры по умолчанию

Сообщение KislotLord »

Собственно есть два класса:

Код: Выделить всё

class Inet {
   public:
        Inet();
        int select (int, struct timeval*, fd_set*, fd_set*, fd_set* );
};
class Server : Inet{
    public:
        void run();
    };

Inet.cpp

Код: Выделить всё

int Inet::select(int sockfd, struct timeval * tval, fd_set* readfds, fd_set* writefds = NULL, fd_set* exceptfds = NULL) {
    int rc = ::select(sockfd, readfds, writefds, exceptfds, tval);
    if (rc < 0) {
        logs.error("select() failed");
        throw Failed();
    }
    if (rc == 0) {
        logs.error("select() timed out.");
        throw TimedOut();
    }
    return rc;
}

Server.cpp

Код: Выделить всё

void Server::run() {
//code
  this->select(socketMax + 1, &tval, &masterSet);
//code
}

Проблема следующая: Компилятор не хочет компилировать это, т.к. он думает, что переменных по умолчанию нет.
Как быть в такой ситуации? Переносить код в хеадер?

Код: Выделить всё

Server.cpp: In member function ‘void Server::run()’:
Server.cpp:77: error: no matching function for call to ‘Server::select(int, timeval*, fd_set*)’
Inet.h:44: note: candidates are: int Inet::select(int, timeval*, fd_set*, fd_set*, fd_set*)
"Daemon" не имеет никакого предубеждения ни к "хорошему", ни к "плохому", а скорее служит, чтобы помогать определить характер личности...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Параметры по умолчанию

Сообщение serzh-z »

KislotLord писал(а):
18.02.2009 12:27
Переносить код в хеадер?
Да. Параметры по умолчанию должны быть указаны в объявлении, а не в описании функции.
Спасибо сказали:
Аватара пользователя
KislotLord
Сообщения: 68

Re: Параметры по умолчанию

Сообщение KislotLord »

serzh-z писал(а):
18.02.2009 12:34
KislotLord писал(а):
18.02.2009 12:27
Переносить код в хеадер?
Да. Параметры по умолчанию должны быть указаны в объявлении, а не в описании функции.

точно, недоглядел

Еще вопрос, вот это предупреждение напрегает, как его устранить?

Код: Выделить всё

 warning: deprecated conversion from string constant to ‘char*’
"Daemon" не имеет никакого предубеждения ни к "хорошему", ни к "плохому", а скорее служит, чтобы помогать определить характер личности...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Параметры по умолчанию

Сообщение NickLion »

string.data() или string.c_str() - преобразование к const char*, а к char* вообще не стоит преобразовывать, это классы как-никак.
Спасибо сказали:
Аватара пользователя
KislotLord
Сообщения: 68

Re: Параметры по умолчанию

Сообщение KislotLord »

Ещё есть вопрос в догонку:

Имеется вот такой exception:

Код: Выделить всё

    class DuplicateException : public std::exception {
    public:

        virtual const char* what() const throw () {
            return "Duplicate object in system";
        }
    };


Но в такой конструкции what не тот дергается:

Код: Выделить всё

catch {
throw DuplicateException;
} catch (exception e) {
logs.info(e.what());
}

Код: Выделить всё

std::exception

А в таком варианте все нормально:

Код: Выделить всё

catch {
throw DuplicateException;
} catch (DuplicateException e) {
logs.info(e.what());
}

Код: Выделить всё

Duplicate object in system


Может c++ и не умеет этого делать, но хотелось бы :(
Кто что посоветует?
"Daemon" не имеет никакого предубеждения ни к "хорошему", ни к "плохому", а скорее служит, чтобы помогать определить характер личности...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Параметры по умолчанию

Сообщение NickLion »

ИМХО такое поведение было бы нелогичным - я, к примеру, могу написать:

Код: Выделить всё

class myexception : public std::exception { };
try{
    throw myexception
}
catch( std::exception e1 ) {
    // 1
}
catch( myexception e2 ) {
    // 2
}

И как быть компьютеру?
если вам нужна такая вариабельность сделайте

Код: Выделить всё

class myex : public std::exception {
private:
    string m_what;
public:
    myex( const string& reason ) { m_what = reason; }
    virtual const char* what() const throw () { return m_what; }
}

try {
    throw myex("some info");
}
catch( myex e ) {
    logs.info(e.what());
}
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Параметры по умолчанию

Сообщение deninok »

(KislotLord) писал(а):

Код: Выделить всё

...
} catch (exception e) {
...

Никогда не перехватывайте объекты исключения по значению! В идеале делать это по ссылке (причём, за исключением редких случаев, константной).
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Параметры по умолчанию

Сообщение deninok »

(NickLion) писал(а):ИМХО такое поведение было бы нелогичным - я, к примеру, могу написать:

Код: Выделить всё

class myexception : public std::exception { };
try{
    throw myexception
}
catch( std::exception e1 ) {
    // 1
}
catch( myexception e2 ) {
    // 2
}

И как быть компьютеру?

Компьютер в такой ситуации выберет то исключение, перехватывающееся первым. Ведь перехват происходит, исходя из типа, а myexception является и самим собой, и наследником (то есть частным случаем) std::exception.
Поэтому в этом коде будет перехвачено 1, а если поменять catch местами - то 2.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Параметры по умолчанию

Сообщение NickLion »

2 deninok
Угу, а предполагалось-то не то :) Просто KislotLord говорил, что наследование не дало эффекта вообще. Сейчас нет под рукой С++, не проверю, а таким образом никогда не писал исключения. А вот насчет ссылок - тут действительно, даже не заметил как-то сразу - последнее время на C# больше писал.
Спасибо сказали:
Аватара пользователя
KislotLord
Сообщения: 68

Re: Параметры по умолчанию

Сообщение KislotLord »

deninok писал(а):
18.02.2009 16:37
(KislotLord) писал(а):

Код: Выделить всё

...
} catch (exception e) {
...

Никогда не перехватывайте объекты исключения по значению! В идеале делать это по ссылке (причём, за исключением редких случаев, константной).

т,е. код

Код: Выделить всё

} catch (exception e) {

заменяем на

Код: Выделить всё

} catch (exception& e) {


так?
"Daemon" не имеет никакого предубеждения ни к "хорошему", ни к "плохому", а скорее служит, чтобы помогать определить характер личности...
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: Параметры по умолчанию

Сообщение Alxn1 »

Неа, вот так:

Код: Выделить всё

}
catch( const exception &e )
{
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Параметры по умолчанию

Сообщение deninok »

Alxn1 писал(а):
19.02.2009 15:37
Неа, вот так:

Код: Выделить всё

}
catch( const exception &e )
{

Да, по умолчанию - константная ссылка, если только нет нужды передавать объекту исключения какую-то информацию (в чём необходимость иногда возникает).
Спасибо сказали: