Вопрос по 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++ знаю не очень хорошо (пока :) )
    
        Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
      
Похожие темы
- Форум Помогите с std::function (2023)
 - Форум [c++] Оптимизация кода работы с байтами (2011)
 - Форум Шаблоны, почему не работает? (2017)
 - Форум Валится на throw (2005)
 - Форум проблемы с std::variant of lambda (2020)
 
- Форум Помогите с boost::spirit (2008)
 - Форум does not name a type... (2013)
 - Форум shared_ptr и union (2015)
 - Форум Цикл имени Rammstein. меня порвало на части.. (2007)
 - Форум Вопрос по шаблонам функций-членов в С++ (2005)