ifstream как член класса [дубликат]

Меня удивляет, что это еще не упоминалось, поэтому для полноты ...

Вы можете выполнить распаковку списка с помощью оператора «splat»: *, который также будет скопируйте элементы вашего списка.

old_list = [1, 2, 3]

new_list = [*old_list]

new_list.append(4)
old_list == [1, 2, 3]
new_list == [1, 2, 3, 4]

Очевидным недостатком этого метода является то, что он доступен только в Python 3.5 +.

Сроки, однако, это работает лучше, чем другие распространенные методы.

x = [random.random() for _ in range(1000)]

%timeit a = list(x)
%timeit a = x.copy()
%timeit a = x[:]

%timeit a = [*x]

#: 2.47 µs ± 38.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.47 µs ± 54.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.39 µs ± 58.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

#: 2.22 µs ± 43.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
0
задан Evan W 15 July 2014 в 22:15
поделиться

3 ответа

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

filestream.swap(ifstream(filename)).

. Тот факт, что он компилируется на визуальной студии, в основном потому, что он встраивается в любое перемещение или перемещение конструктора (я не очень хорошо говорю вам, что именно) , Если вы попробуете

std::ifstream myF;
filestream = myF;

, он не будет компилироваться.

Однако вы можете попытаться сделать перемещение, которое я написал, или вы можете просто вызвать .open ( http : //en.cppreference.com/w/cpp/io/basic_ifstream/open )

2
ответ дан Creris 21 August 2018 в 12:23
поделиться
  • 1
    Я просто добавил filestream.open(filename) в тело конструктора Parser. Я забыл, что вы можете открыть файл за пределами конструктора потока ... doh! – Evan W 15 July 2014 в 22:13

std :: ifstream не имеют конструктора копирования, вероятно, одного из многих расширений VC ++. Правильный код:

Parser::Parser(const char* filename) :
   filename(filename),
   linect(0),
   filestream(filename)
{
}

Обратите внимание на переменную-член и имя параметра. Используйте это-> или измените имя (рекомендуется, обычно префикс используется для переменных-членов _ или m_)

1
ответ дан NetVipeC 21 August 2018 в 12:23
поделиться
  • 1
    что, если строка определена перед fstream? не будет ли потенциально пустить filestream, так как переменные-члены строятся в порядке их объявления (afaik)? – Creris 15 July 2014 в 22:06
  • 2
    Интересно, хотя и немного запутанно. Я поеду с другим вариантом. – Evan W 15 July 2014 в 22:10
  • 3
    в inline-инициализации я пытался использовать всегда переменные параметров, чтобы избежать этого типа ошибок, да, переменные-члены инициализируются в том же порядке, в каком они объявлены, а не в порядке, используемом при встроенной инициализации, GCC с опцией -Wall предупреждают об этом , Проблема в этом случае заключается в том, что имя параметра == имя параметра – NetVipeC 15 July 2014 в 22:12

Я думаю, лучшее решение для вас было бы для вас:

  1. Сначала создайте ifstream.
  2. Постройте Parser с помощью объекта ifstream.
  3. Измените Parser, чтобы сохранить ссылку на объект istream. Это позволяет вам гибко анализировать содержимое файла, stdin и строку.

class Parser
{
   private:
      std::istream& str;
      std::vector<std::string> tokens;
      unsigned int linect;

   public:
      Parser(std::istream& s) : str(s) ... {}

      ...
};
0
ответ дан R Sahu 21 August 2018 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: