2017-12-12 16 views
-1

잘못되고있는 문제와 해결 방법을 파악하는 데 어려움을 겪고 있습니다. 난 포인터를 통해 클래스의 과부하 배열 첨자 연산자 ([])를 사용하고 있지만, I는 컴파일러 에러를 받고있어 : 예상 비정규-ID 를 다음 설명C++ 포인터에 오버로드 된 연산자를 사용하는 문제 : 예상 된 비 한정 ID 오류

if (!(books->[i].isEmpty()) && books->[i].getIsbn() == ISBNnumber) { 
        if (numBooks <= books->[i].getQty()) { 
         listToPrint.push_back(books->[i]); 
         qntyPurchased.push_back(numBooks); 
         books->[i].setQty(books->[i].getQty() - numBooks); 
        } else { 
         cout << "\nThere aren't enough copies to fulfill this order.\n\n"; 
        } 
        foundFlag = true; 
        break; 
       } 
참고로

으로 'books'는 다른 클래스의 인스턴스에 대한 포인터를 저장하는 클래스 멤버입니다.

class Menu { 
private: 
// Pointer to a bookCollection object 
static BookCollection *books; 
} 

class BookCollection 
{ 
static const int MAX_BOOKS = 20; 
BookData book[MAX_BOOKS]; // array of BookData objects 
int findBook(string); 

public: 
BookData &operator[](const int i) { return book[i]; 
} 

것은 내가 배열 첨자 연산자와 같은 또 다른 포인터를 치료하는 컴파일러에 대한 기대했지만, 제대로 동작하지 않습니다. (books-> operator.isEmpty()) 연산자 함수 호출을 사용하면 작동합니다. 그러나이 코드는 더 깨끗한 코드를 사용하지 않기 위해 노력했습니다.

제안 오류 해결하기 위해 찾고 :이 식 (그리고 다른 유사한 표현)

books->[i].isEmpty() 

구문이 유효하지 않습니다 예를 들어 예상 비정규-ID

+0

'책 -> [I] .isEmpty()'->'책 [I] .isEmpty()': 물론)

는 다음과 같은 작업 예제를 참조하십시오? –

+1

@wlovo 당신은 books-> operator [] (i) .isEmpty()를 의미하는 것처럼 보입니다. 또는 (* books) [i] .isEmpty() –

+0

books [i] .isEmpty는 작동하지 않지만 (* books) [i] .isEmpty는 작동합니다. 다시 한번 감사드립니다. – wlovo

답변

3

합니다.

대신

#include <iostream> 

int main() 
{ 
    class BookData 
    { 
    public: 
     bool isEmpty() { return true; } 
    }; 

    class BookCollection 
    { 
     BookData book[10]; // array of BookData objects 

    public: 
     BookData & operator[](size_t i) 
     { 
      return book[i]; 
     } 

     const BookData & operator[](size_t i) const 
     { 
      return book[i]; 
     } 
    }; 

    class Menu 
    { 
    public: 
     BookCollection *books; 
    }; 

    BookCollection b; 
    Menu m = { &b }; 

    if (m.books->operator[](0).isEmpty()) 
    { 
     std::cout << "It works!" << std::endl; 
    } 

    if ((*m.books)[0].isEmpty()) 
    { 
     std::cout << "And this one works!" << std::endl; 
    } 
} 

출력이

books->operator [](i).isEmpty() 

또는 여기

(*books)[i].isEmpty() 

단순화 된 예시적인 프로그램을 사용이다

It works! 
And this one works! 
+0

(* books) [i] 작동하는 것 같습니다. 나는 이것을 해결하기에는 너무 쉽다고 생각했다 ... – wlovo

1

진술 문 books->[i].isEmpty()은 구문 오류입니다. 당신의 연산자로 BookCollection에서 []는 내부 배열의 밖으로 BookData -object에 대한 참조를 반환, 다음과 같은 방법으로 연산자를 사용해야합니다 :

books[i].isEmpty() && books[i].getIsbn() 

(BookData이의, 방법 isEmpty()를 제공하고 getIsbn()한다고 가정 .

struct Foo { 
    int getX() { return x; } 
    int x=0; 
}; 

class BookCollection 
{ 
    static const int MAX_BOOKS = 20; 
    Foo book[MAX_BOOKS]; // array of BookData objects 

public: 
    Foo &operator[](const int i) { return book[i]; } 
}; 

int main() { 
    BookCollection *b = new BookCollection(); 
    int x = ((*b)[10]).getX(); 
} 
+0

나는 원래 책 [i]을 사용했지만 BookData에 존재하는 .isEmpty 또는 .getIsbn 함수를 가지고 있지 않은 책에 대해서는 나에게 오류를 주었다. 함수에 BookCollection을 사용하는 것처럼 보였으므로 대신 books-> operator [] (i)를 사용해야했습니다. – wlovo

+0

정말요? 그냥 시험해 보았습니다. (적응 된 답변 참조) –

+0

제 편이 아닙니다.BookData 클래스에 대한 참조 여야하지만 컴파일러는 "Class BookCollection에 isEmpty '함수가 없습니다"라고 표시합니다. – wlovo