2016-07-08 2 views
-1

좋아, 기본적으로 인터넷을 통해 검색했지만 실제로 상황을 충분히 설명하거나 전혀 설명하지 않은 것을 찾았습니다.클래스 이름이 매개 변수로 사용되는 함수

우리는 book이라는 클래스가 있다고 가정 해 봅시다. 그 클래스에 두 개의 객체를 추가합니다 (각 객체는 제목과 릴리스 날짜가 있습니다 (릴리스 날짜는 일, 월, 일로 기록됩니다).

좋아요,이 두 객체의 이름을 각각 BOOKONE과 BOOKTWO로 지정하겠습니다. 각 오브젝트의 내용이 다음과 같은 매개 변수를 수신하고, 수정 함수를 작성한다.

(BOOKONE, 12, 5, 2017) 수정에 현재 일로부터 BOOKONE의 발매일 수정할 것이이 함수 거기에 하나 있습니다. 기본적으로 함수의 내용은 필요하지 않지만 개체의 이름을 해당 함수의 매개 변수로 제공 할 수있는 방법을 알아야합니다. 매개 변수로 제공해야합니다. 그냥 함수를 만들고 BOOKOKE.modify와 같이 호출하십시오.

나는 그것이 어떻게 보일지 전혀 모른다.

이 (?????, INT X, INT y를 INT의 Z)

+0

개체를 함수의 매개 변수로 사용할 수없는 이유는 무엇입니까? 'void 수정 (book, int x, int y, int z)'은 잘 동작합니다. 또는 사본 대신 참조를 전달하려면'void modify (book & theBook, int x, int y, int z)'를 사용하십시오. – immibis

+2

짧은 대답은 여기에 있습니다 : 직접 코드를 작성하십시오. C++ [리플렉션 없음] (https://en.wikipedia.org/wiki/Reflection_ (computer_programming)). 불투명 한 문자열 (또는 다른 성격의 식별자)을 개별 객체로 매핑하는 자체 메커니즘을 구현하는 것은 개발자의 몫입니다. –

+0

검색을 통해 답변을 찾으려면 요구 사항을 올바르게 설명하는 방법을 알아야합니다. 나는 이것을 일대일 멘토링을위한 대화방으로 데려가시기 바랍니다. Q & A 데이터베이스에는 적합하지 않습니다. –

답변

3

에게 당신을 수정 : 내가 설명하는 물건에 나쁜 될 수 있습니다 알고 있기 때문에

여기에 주요 문제입니다 그들의 이름으로 색인 된 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 
} 

booksname 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++로 개발하지 않는 한 놀라움은 없을 것입니다.

+1

'name'이'books'에 존재하지 않으면'books [name]'에 접근하면 새로운'book' 객체가 생성됩니다. 그런 일이 일어나지 않게하려면 대신'books.find (name)'를 사용하십시오 :'std :: map :: iterator iter = books.find (name); if (iter! = books.end()) iter.second.setreleasedate (일, 월, 년);' –

관련 문제