에게 당신을 수정 : 내가 설명하는 물건에 나쁜 될 수 있습니다 알고 있기 때문에
여기에 주요 문제입니다 그들의 이름으로 색인 된 std::map
개의 도서를 만들 수 있습니다.
std::map<std::string, book> books;
그리고
bool modify(const std::string &name, int day, int month, int year)
{
books[name].setreleasedate(day, month, year);
return true; // always succeeds
}
이 books
에 name
D 책을 찾거나 자동으로 존재하지 않는 경우 name
D 책을 만든 다음을 설정하기위한 book
의 메소드를 호출 출시일. 당신이 book
의이 즉시 생성하지 않으려면
, 옵션은 사용할 수 있습니다 std::map::at
또는 std::map::find
std::map::at
버전 :
bool modify(const std::string &name, int day, int month, int year)
{
try
{
books.at(name).setreleasedate(day, month, year);
return true;
}
catch(std::out_of_range &) // did not find named book
{
return false;
}
}
이의 처리에 상당한 성능 저하를 가지고 알 수없는 서적은 예외적이지 않기 때문에 알 수없는 서적을 자주 조회하는 경우는 예외입니다. 이름이 암시하는 것처럼 예외는 예외적 인 이벤트에만 사용해야합니다. 관심이있는 이유는 여기에서 읽을 수 있습니다 : Are Exceptions in C++ really slow
at
메서드를 얻으려면 C++ 11 표준 지원이 필요합니다.
std::map::find
버전 :
bool modify(const std::string &name, int day, int month, int year)
{
std::map<std::string, book>::iterator found; // could be auto found if C++11 is enabled
found = books.find(name)
if (found != books.end()) // if search ended before the end of books
{
found->setreleasedate(day, month, year);
return true;
}
else // did not find named book
{
return false;
}
}
이 버전은 조금 더 많은 코드를 필요로하고 가까이 사소한 비용 모든 시간을 추가하지만 실패의 경우에 상당한 벌금이 없습니다.
또한 모든 C++에서 표준화의 시작 부분으로 지원됩니다. 터보 C++로 개발하지 않는 한 놀라움은 없을 것입니다.
개체를 함수의 매개 변수로 사용할 수없는 이유는 무엇입니까? 'void 수정 (book, int x, int y, int z)'은 잘 동작합니다. 또는 사본 대신 참조를 전달하려면'void modify (book & theBook, int x, int y, int z)'를 사용하십시오. – immibis
짧은 대답은 여기에 있습니다 : 직접 코드를 작성하십시오. C++ [리플렉션 없음] (https://en.wikipedia.org/wiki/Reflection_ (computer_programming)). 불투명 한 문자열 (또는 다른 성격의 식별자)을 개별 객체로 매핑하는 자체 메커니즘을 구현하는 것은 개발자의 몫입니다. –
검색을 통해 답변을 찾으려면 요구 사항을 올바르게 설명하는 방법을 알아야합니다. 나는 이것을 일대일 멘토링을위한 대화방으로 데려가시기 바랍니다. Q & A 데이터베이스에는 적합하지 않습니다. –