위임 생성자를 사용하는 동안 멤버 초기화
나는 C ++ 11 표준을 시도하기 시작했고 init 메소드 등을 피하기 위해 같은 클래스의 다른 ctor에서 ctor를 호출하는 방법을 설명하는 이 질문을 발견 했습니다 . 이제 다음과 같은 코드로 동일한 작업을 시도하고 있습니다.
hpp :
class Tokenizer
{
public:
Tokenizer();
Tokenizer(std::stringstream *lines);
virtual ~Tokenizer() {};
private:
std::stringstream *lines;
};
cpp :
Tokenizer::Tokenizer()
: expected('=')
{
}
Tokenizer::Tokenizer(std::stringstream *lines)
: Tokenizer(),
lines(lines)
{
}
그러나 이것은 나에게 오류를주고 있습니다 In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegation
.Tokenizer () 부분을 목록에서 처음과 마지막으로 이동하려고 시도했지만 도움이되지 않았습니다.
그 이유는 무엇이며 어떻게 수정해야합니까? 나는 대신에 lines(lines)
몸으로 움직여 보았습니다 this->lines = lines;
. 하지만 이니셜 라이저 목록을 사용하고 싶습니다.
멤버 초기화를 다른 생성자에 위임 할 때 다른 생성자가 모든 멤버를 포함하여 (예 : 예제에 멤버 포함) 객체를 완전히 초기화한다고 가정합니다 lines
. 따라서 멤버를 다시 초기화 할 수 없습니다.
표준의 관련 인용문은 다음과 같습니다.
(§12.6.2 / 6) mem-initializer-list는 생성자의 클래스 자체를 나타내는 모든 class-or-decltype을 사용하여 생성자 클래스의 다른 생성자에 위임 할 수 있습니다. mem-initializer-id가 생성자의 클래스를 지정하면, 이것이 유일한 mem-initializer가됩니다 . 생성자는 위임 생성자이고에서 선택한 생성자는 대상 생성자입니다. [...]
먼저 인수를받는 생성자의 버전을 정의하여이 문제를 해결할 수 있습니다 .
Tokenizer::Tokenizer(std::stringstream *lines)
: lines(lines)
{
}
위임을 사용하여 기본 생성자를 정의합니다.
Tokenizer::Tokenizer()
: Tokenizer(nullptr)
{
}
일반적으로 가장 많은 수의 인수를 사용하는 생성자의 해당 버전을 완전히 지정한 다음 다른 버전에서 위임해야합니다 (위임에서 원하는 기본값을 인수로 사용).
참고 URL : https://stackoverflow.com/questions/12190051/member-initialization-while-using-delegated-constructor
'program tip' 카테고리의 다른 글
IntelliJ의 Shelve와 Git 숨김의 차이점은 무엇입니까? (0) | 2020.09.17 |
---|---|
어떤 Box2D JavaScript 라이브러리를 사용해야합니까? (0) | 2020.09.17 |
어떤 이벤트가 (0) | 2020.09.17 |
동기 XMLHttpRequest를 사용하는 이유가 있습니까? (0) | 2020.09.17 |
Angular2의 프로덕션 모드와 개발 모드의 차이점은 무엇입니까? (0) | 2020.09.17 |