LINUX.ORG.RU

C++ и переходы на метки


0

0

Вопрос по C++

Заголовочный файл

#ifndef __symbol_scalar_hxx
#define __symbol_scalar_hxx

#include "symbol.hxx"

#include "pyxis_lexer.hxx"

#include <string>

namespace engine_stuff {

  struct symbol_scalar_exception {
    enum symbol_scalar_exception_type {
      undefined_variable
    } type;

    symbol_scalar_exception (symbol_scalar_exception_type t): type (t)
    {}
  };

  class symbol_scalar: public symbol {
  public:
    enum symbol_scalar_type {
      undef_scalar, bool_scalar, double_scalar, string_scalar
    };

  private:
    std::string name;

    symbol_scalar_type type;

    bool        bool_value;
    double      double_value;
    std::string string_value;

  public:
    symbol_scalar (std::string & n);

    bool operator == (const symbol_scalar & symb) const;
    long hfunc ();

    void set_type (symbol_scalar_type t);

    void set_value (bool bool_val);
    void set_value (double double_val);
    void set_value (std::string & string_val);

    const symbol_scalar_type & get_type ();

    const bool &        get_bool_value ();
    const double &      get_double_value ();
    const std::string & get_string_value ();
  };

};

#endif // __symbol_scalar_hxx

Реализация функции get_string_value:

const std::string &
engine_stuff::symbol_scalar::get_string_value ()
{
  switch (type) {
  case undef_scalar:
    throw symbol_scalar_exception (symbol_scalar_exception::undefined_variable);
  case bool_scalar:
    string_value = bool_value ? "true" : "false";
    break;
  case double_scalar:
    char tmp[100];
    {
      std::strstream string_value_stream (tmp, sizeof (tmp), std::ios::in | std::ios::out);
      string_value_stream << double_value;
      string_value_stream >> string_value;
    }

    break;
  case string_scalar:
    break;
  }

  return string_value;
}


Блок
    {
      std::strstream string_value_stream (tmp, sizeof (tmp), std::ios::in | std::ios::out);
      string_value_stream << double_value;
      string_value_stream >> string_value;
    }
пришлось заключить в фигурные скобки, т.к. g++-3.0 не захотел компилить (поcкольку для string_value_stream в конце блока switch генерируется деструктор, но при переходе на case string_scalar объект string_value_stream не будет создан.

Теперь непосредственно вопрос, почему захотело компилиться так:
  case double_scalar:
    char tmp[100];

    std::strstream string_value_stream (tmp, sizeof (tmp), std::ios::in | std::ios::out);
    string_value_stream << double_value;
    string_value_stream >> string_value;
    string_value_stream.~strstream ();

    break;

Здесь я явно вызываю деструктор... Не понимаю...

P. S. Просьба не судить строго, C++ знаю не очень хорошо (пока :) )
anonymous

Re: C++ и переходы на метки

Извините, описался - НЕ ЗАХОТЕЛО КОМПИЛИТЬСЯ!!!

Теперь непосредственно вопрос, почему НЕ захотело компилиться так: case double_scalar: char tmp[100];

std::strstream string_value_stream (tmp, sizeof (tmp), std::ios::in | std::ios::out); string_value_stream << double_value; string_value_stream >> string_value; string_value_stream.~strstream ();

break;

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.