2010-02-11 4 views
0

저는 간단한 C++ 그리드 클래스를 구현하고 있습니다. 지원해야하는 함수 중 하나는 둥근 괄호를 통해 액세스 할 수 있으므로 mygrid (0,0)을 작성하여 요소에 액세스 할 수 있습니다. 나는() 연산자를 오버로드하고 오류 메시지가 나타납니다 : "할당에서 비 lvalue".할당에서 간단한 그리드 클래스, 비 lvalue를 만들려고합니다.

내가 할 수 있기를 원하는 :

//main 

cGrid<cA*> grid(5, 5); 

grid(0,0) = new cA(); 

발췌 그리드 클래스의 내 구현의 :

템플릿 클래스 cGrid 의 {

private: 
    T* data; 
    int mWidth; 
    int mHeight; 

public: 
    cGrid(int width, int height) : mWidth(width), mHeight(height) { 
     data = new T[width*height]; 
    } 

    ~cGrid() { delete data; } 

    T operator()(int x, int y) 
    { 
     if (x >= 0 && x <= mWidth) { 
      if (y >= 0 && y <= mHeight) { 
       return data[x + y * mWidth]; 
      } 
     } 
    } 


    const T &operator()(int x, int y) const 
    { 
     if (x >= 0 && x <= mWidth) { 
      if (y >= 0 && y <= mHeight) { 
       return data[x + y * mWidth]; 
      } 
     } 
    } 

나머지를 코드는 반복자의 구현을 다룬다.

+0

변형 함수에 const로 표시하면 안됩니다. 그렇지 않으면 const cGrid를 사용하여 내용을 변경할 수 있습니다. – Bill

답변

0

빌이 언급 했으므로 연산자는 const이 아니어야합니다. 나는 이것이 컴파일 오류의 이유라고 믿는다 (보고 된 오류가 다르게 보일지라도). 컴파일러는 템플릿 클래스이므로 할당 선에서만 오류가 발생합니다.

분명히 말하면 const 메서드는 const에 대한 참조를 반환 할 수 없습니다. 즉, 문제는 신고 T &operator... const이 불법이라는 것입니다. T &operator... 또는 const T &operator... const이어야합니다. 물론 둘 다 가질 수 있습니다.

편집 : 이제 두 방법 모두 동일한 서명을 가지고 있기 때문에 도움이되지 않는 const 제거는 (반환 형식은 통화를 해결을 위해 서명의 일부로 간주되지 않음). 호출 된 메서드는 T &이 아니라 T을 반환하는 메서드입니다. 없애거나 const 메서드를 사용하여 const 참조로 바꿉니다.

+0

T & operator ... const는 나를 위해 오류를 발생시킵니다. ".. \ include \ Grid.h | 32 | error : T & cGrid :: operator() (int, int) [T = cA *] 'andT cGrid :: operator() (int, int) [T = cA *] '를 오버로드 할 수 없습니다. " const T & operator ... const는 컴파일 가능합니다. 그래서 나는 그걸 가져갈거야. – Tyrfing

+0

, 감사합니다. – Tyrfing

0

이 템플릿 기능 : X & y는 범위를 벗어난 경우

T &operator()(int x, int y) const 
{ 
    if (x >= 0 && x <= mWidth) { 
     if (y >= 0 && y <= mHeight) { 
      return data[x + y * mWidth]; 
     } 
    } 
} 

할을? 예외를 발생시켜야합니다. 그리고 생성자의 그리드에 메모리를 어떻게 할당합니까? constness와 관련하여이 연산자의 두 버전, 즉 const 참조를 반환하는 const 연산자와 비 const 참조를 반환하는 비 const 연산자를 제공해야합니다.

편집 : 운영자에게 한 번의 오류가 있습니다. 컴파일 및 실행 :

template <typename T> 
struct Grid { 
    Grid(int x, int y) : mX(x), mY(y), mData(0) { 
     mData = new T[ x * y ]; 
    } 

    ~Grid() { 
     delete [] mData; 
    } 

    T &operator()(int x, int y) { 
     if (x >= 0 && x < mX) { 
      if (y >= 0 && y < mY) { 
       return mData[x + y * mX]; 
      } 
     } 
    throw "out of range" ;; 
    } 

    int mX, mY 
    T * mData; 
}; 


int main() { 
    Grid <int> g(2,3); 
    g(0,0) = 42; 
} 
+0

그리드 할당 : 개인 : T * 데이터; public : cGrid (int width, int height) : mWidth (width), mHeight (height) { data = new T [width * height]; } 예, 예외를 발생시켜야합니다. ty – Tyrfing

+0

괜찮은 컴파일러는 값을 반환하지 않고 함수를 종료하는 실행 경로가 있음을 경고합니다 (반환 값이있는 함수의 경우). – Ari

+0

고맙습니다. 이제 모든 작업이 – Tyrfing

관련 문제