1

이것은 매우 명백한 질문 일 수 있습니다. 나는 내 프로젝트에서 코드 아래에있는포인터 액세스 연산자의 의미를 변경하는 방법

,

#include <stdio.h> 
class X 
{ 
    public: 
    int i; 
    X() : i(0) {}; 
}; 

int main(int argc,char *arv[]) 
{ 
    X *ptr = new X[10]; 
    unsigned index = 5; 
    cout<<ptr[index].i<<endl; 
    return 0; 
} 

질문
은 내가 ptr[index]의 의미를 변경할 수 있습니까? ptr[a[index]]의 값을 반환해야하기 때문에 여기서 a는 하위 색인 생성을위한 배열입니다. 기존 소스 코드를 수정하고 싶지 않습니다. 행동을 바꿀 수있는 새로운 기능이 추가되었습니다.

인덱스 연산자가 내 코드에서 너무 많아서 (정확한 536 개) 인덱스 하위 연산자 안에 복잡한 수식이 있으므로 많은 위치에서 코드를 변경하지 않을 것입니다.


PS는 :
1. I 연산자 과부하를 시도하고 불가능 결론에 도달했다.
2. 또한 p [i]는 * (p + i)로 변환됩니다. 나는 기본 연산자 '+'를 재정의 할 수 없다.

그래서 내 이해를 재확인하고 가능한 단축키가 있는지 확인하고 싶습니다.
기타 나는 로얄 방법 모든 코드 줄을 수정해야합니다 :).

+0

Leeeeeek 삭제 [] ptr? – Learner

+0

:) 그래, 죄송합니다. 나는 서둘러 질문을 게시 했으므로 추가하지 않았습니다. :) 다시. –

답변

2

Alex가 말한 것처럼 []의 '하위 색인 생성'사용법은 코드를 읽는 사람에게는 전혀 알려지지 않을 것입니다.

template<class T> 
class SubindexingList { 
    vector<T> data; 
    vector<int> subindexes; 
public: 
    SubindexingList(int count) : data(count) { } 
    void set_subindexes(vector<T> const& newval) { subindexes = newval; } 
    T& operator[](int index) { return data[subindexes[index]]; } 
    T const& operator[](int index) const { return data[subindexes[index]]; } 
}; 

을 그리고 SubindexingList<X> stuff(10);X *ptr = new X[10]; 교체 :

는 이와 같은 클래스를 정의 할 수 말했다.

+0

당신은이 솔루션에 나를 때려 눕힌다. 유일한 것은 생성자에게 서브 인덱스를 넘겨주고 크기를 결정하는 것이 좋다는 것이다. 가능하다면. 올바른 컨텍스트에서 사용하면 소리가 나는 것처럼 기괴하지 않을 수도 있습니다 ... – Stephen

+0

물론이 질문에 대한 대답은 중요하지 않습니다. –

+0

고마워요! 가능한 최상의 솔루션을 구입하십시오. 비록 당신이 제공 한 이전 게시물이 좋았지 만 (하위 인덱스가 생성자에서 전달 된 곳에서, 이것은 사용자에게 무언가를 강요합니다). –

3

예, 모든 인수가 기본 제공 유형 (원시 포인터 포함) 인 사용자 지정 연산자는 정의 할 수 없습니다.

또한 연산자를 이와 같이 명확하지 않은 방식으로 정의하는 것은 거의 항상 좋은 생각이 아닙니다.

너비가 X 인 원시 포인터를 하나처럼 작동하는 클래스로 교체하는 것이 좋습니다. 코드에 따라 일 수도 있고 일 수도 있습니다 (예 : 많은 템플릿이있는 경우).

+0

감사! 알렉스, 좋은 제안. –

관련 문제