XML 파일을 구문 분석하고 콘텐츠와 사용되는 메서드를 기반으로 데이터를 반환하는 클래스가 있습니다. 경로가있는 파일 이름이나 이미 열려있는 파일에 대한 포인터를 사용하여 개체를 시작할 수 있기를 원합니다.
이미 열린 파일에 대한 포인터가 주어지면 생성자를 실행하고 그게 전부입니다. 파일 이름이 전달되면 해당 생성자는 파일을 연 다음 열린 파일의 주소를 두 번째 생성자에 전달합니다.
//foo.h
class foo
{
public:
foo(const QString fileName);
foo(QFile *fp);
...
...
}
//foo.cpp
class foo::foo(const QString fileName)
{
if(fileName.isEmpty()) {
// Return error.
} else {
// Open file and pass the address to the second constructor.
fp = new QFile(fileName);
fp->open(...);
foo::foo(fp); // Execute second constructor.
}
}
class foo::foo(QFile *fp)
{
if(fp == NULL) {
// Return error.
} else {
// Do stuff with open file and further initiate the object.
}
}
이 작업을 수행하는 방법에 대한 첫 번째 아이디어 였지만 문제가 너무 복잡하다고 생각합니다. 이 작업을 수행하는 데 적합한 방법입니까, 정상입니까? 이러한 유형의 상황에 대한 모범 사례가 있습니까?
에서 C++11
, 당신은 생성자 위임 도움이 될 수 있습니다.
경우 C++11
옵션이 아닙니다, 무거운 리프팅을하는 개인 "초기화"기능을 가지고 각각의 생성자에서 호출하도록 코드를 리팩토링.
class foo
{
public:
foo(const QString fileName) { /* open QFile, call load() */ }
foo(QFile *fp) { load(fp); }
...
private:
void load(QFile* fp);
};
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다