...たとえばこんなカンジかしら。コタエになってますか?
C++
1// foo.cpp
2
3#include <iostream>
4#include <vector>
5#include <fstream>
6#include <string>
7
8// 利用者には隠しておく(ここから)
9namespace detail {
10 class Module {
11 std::ifstream stream_;
12 public:
13 Module(const std::string& path) : stream_(path) {}
14 std::string get() { std::string line; std::getline(stream_, line); return line; }
15 };
16
17 std::vector<Module> mods; // Module集合
18}
19// 利用者には隠しておく(ここまで)
20
21/* Moduleを生成し modsに追加。*/
22int LoadModule(const std::string& path) {
23 int handle = detail::mods.size();
24 detail::mods.emplace_back(path);
25 return handle;
26}
27
28/* Module::get() をcallし、ファイルから一行読んで返す */
29std::string GetLine(int handle) {
30 return detail::mods.at(handle).get();
31}
32
33int main(){
34 int handle = LoadModule("foo.cpp");
35 for ( int i = 0; i < 4; ++i ) {
36 std::string line = GetLine(handle);
37 std::cout << line << std::endl;
38 }
39}
[追記] コンパイル単位を分けてみた:
C++
1// Module.h
2#pragma once
3
4#include <string>
5
6int LoadModule(const std::string& path);
7std::string GetLine(int handle);
C++
1// Module.cpp
2#include "Module.h"
3#include <vector>
4#include <fstream>
5
6namespace {
7 class Module {
8 std::ifstream stream_;
9 public:
10 Module(const std::string& path) : stream_(path) {}
11 std::string get() { std::string line; std::getline(stream_, line); return line; }
12 };
13
14 std::vector<Module> mods; // Module集合
15}
16
17/* Moduleを生成し modsに追加。*/
18int LoadModule(const std::string& path) {
19 int handle = mods.size();
20 mods.emplace_back(path);
21 return handle;
22}
23
24/* Module::get() をcallする */
25std::string GetLine(int handle) {
26 return mods.at(handle).get();
27}
C++
1// foo.cpp
2#include <iostream>
3#include "Module.h"
4
5int main(){
6 int handle = LoadModule("foo.cpp");
7 for ( int i = 0; i < 4; ++i ) {
8 std::string line = GetLine(handle);
9 std::cout << line << std::endl;
10 }
11}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/15 10:32
2021/04/15 11:25
2021/04/15 14:09