nixp.ru v3.0

23 января 2017,
понедельник,
11:30:43 MSK

DevOps с компанией «Флант»
Longobard написал 28 декабря 2003 года в 20:01 (637 просмотров) Ведет себя как мужчина; открыл 291 тему в форуме, оставил 2499 комментариев на сайте.

У меня проблема:

Есть класс Bolvan:

class Bolvan {
private:
  char* device;
  /*и т.д.*/
protected:
  int sg_fd;
public:
  struct FDError {
     const char* message;
     FDError (const char* p) { message = p; }
  };
  Bolvan (char* io_device);
  ~Bolvan ();
  /*****И т.д.*****/
};

И у него есть конструктор:

Bolvan::Bolvan (char* io_device) {
sg_fd = open (io_device, O_RDONLY);
if (sg_fd < 0) {
  char *msg;
  sprintf (msg, "Unable to open device %s\n", io_device);
#ifdef DEBUG
  sprintf (msg, "open (io_device, O_RDONLY) failed. \n Maybe device name is not valid.\n Check open() call in bolvan.cpp\n");
#endif
  throw FDError ((const char*)msg);
}
/***** И т.д. и т.п. */
}

Я в main задаю девайс и перехватываю исключение:

int main (int argc, char* argv[])
{
try {
  Bolvan CB ("/dev/hdc");
}
catch (Bolvan::FDError e) {
  std::cerr << "File Descriptor error: " << e.message;
  return 1;
}
/******и т.д.***/
}

Так вот, при комиляции мне g++ пишет, что ФУНКЦИЯ CB НЕ ОПРЕДЕЛЕНА! Я пробовал Bolvan CB = Bolvan («/dev/hdc»);. Тот же результат Если исключение не перехватывать (убрать try & catch), то все работает. У Бьерна написано, что можно перехватывать исключения из конструкторов. Однако g++ на это ругается.

P.S.: Все нужные хидеры включены.

P.P.S.:Заранее спасибо. Надеюсь на Ваш квалифицированный ответ

P.P.P.S: g++ —version: 3.2

anonymous

Очень интересно!! Я еще поковыряюсь с этим, пока могу только сказать, попробуй

try {

Bolvan* CB = new Bolvan(«/dev/hdc»);

}

catch (Bolvan::FDError e) {

и далее по тексту. Будет работать. Почему, пока не знаю, но попробую разобраться. Кстати, на CB ругается компилярор или ЛИНКЕР? У меня ругается линкер.

Интересная задачка! :-)

I’ll be back,

Good Luck for now,

UT

anonymous

Нашел!! Вот она твоя ошибка:

~Bolvan ();

Либо определи деструктор где-нибудь, либо напиши

~Bolvan (){};

И все будет путем!

Good Luck,

UT

Longobard

Да не в этом ошибка. У меня есть целый СПП_шник, где описаны все функции класса Bolvan (их 28 штук), среди них и деструктор. Просто я привел здесь только куски.

Далее. Ругается у меня не линкер, а компилер.

Кроме того. Я еще раз ВНИМАТЕЛЬНО перечитал Бьерна, вроде я все делаю правильно. Блин, в чем же дело?

Longobard

Попробовал сделать так, как ты сказал (через динамическое создание через new). Та же маза.

Longobard

Получилось. Но возникла енще трабла:

http://www.nixp.ru/cgi-bin/forum/YaBB.pl?board=coding;action=display;num=1072725365;start=0#0

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.