일종의 제네레이터 (적어도 파이썬에서 사용한 적이 있습니다)의 기능을 이해합니다. switch 문과 내용이 어떻게 형성되는지 이해합니다. 그러나 이러한 오류가 발생합니다.C++의 생성자 - 비 정적 데이터 멤버의 잘못된 사용
test.cpp: In constructor 'Foo::descent::descent(int)':
test.cpp:46: error: invalid use of nonstatic data member 'Foo::index_'
test.cpp: In member function 'bool Foo::descent::operator()(std::string&)':
test.cpp:50: error: invalid use of nonstatic data member 'Foo::bars_'
test.cpp:50: error: invalid use of nonstatic data member 'Foo::index_'
test.cpp:51: error: invalid use of nonstatic data member 'Foo::index_'
test.cpp:51: error: invalid use of nonstatic data member 'Foo::bars_'
test.cpp:52: error: invalid use of nonstatic data member 'Foo::index_'
다음은 코드입니다. 이 문제를 해결할 더 좋은 방법이 있다면 꼭 공유하십시오. 당신의 오류가 발생하는 위치를
#include <math.h>
#include <string>
#include <vector>
#include <iostream>
#ifndef __generator_h__
#define __generator_h__
// generator/continuation for C++
// author: Andrew Fedoniouk @ terrainformatica.com
// idea borrowed from: "coroutines in C" Simon Tatham,
// http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
struct _generator
{
int _line;
_generator():_line(0) {}
};
#define $generator(NAME) struct NAME : public _generator
#define $emit(T) bool operator()(T& _rv) { \
switch(_line) { case 0:;
#define $stop } _line = 0; return false; }
#define $yield(V) \
do {\
_line=__LINE__;\
_rv = (V); return true; case __LINE__:;\
} while (0)
#endif
class Foo {
int index_;
std::vector<std::string> bars_;
public:
Foo() {
index_ = 0;
bars_.push_back("Foobar");
bars_.push_back("Barfoo");
}
$generator(descent){
int j;
descent(int j) {
index_+=j;
}
$emit(std::string)
while(true) {
$yield(bars_[index_++]);
if(index_ >= bars_.size())
index_ = 0;
}
$stop;
};
//descent bar;
void InitGenerator() { index_ = 0; }
};
using namespace std;
int main()
{
//Foo::descent gen(1);
//for(int n; gen(n);) // "get next" generator invocation
// cout << n << endl;
return 0;
}
그래서 당신이 할하려는 거죠? – stefanB
와우, #define에서 '$'를 사용할 수 있는지 몰랐다. –
당신은'#define BEGIN {'을 사용하고 이것을 약간 좋아한다. C++로도 Pascal을 프로그래밍 할 수있다. 그러나 그렇다고해서 언어를 남용하는 것이 좋은 생각은 아닙니다. 그것은 내가 해독하기 시작하고 싶지 않은 끔찍한 코드입니다. (C와 C++의 거의 20 년 후에,'$ '를 포함하는 매크로를 가질 수 있는지조차 알지 못했습니다. 그렇습니다. 자주 사용됩니다.) C++에서하는 방법을 배우십시오.좋은 시작은 목표를 진술하고 C++에서 그것을 성취하는 방법을 묻는 새로운 질문 일 수 있습니다. – sbi