Const, преобразование и общая проблема с массивом - PullRequest
1 голос
/ 28 ноября 2009

У меня проблема в этих строках:

const int* index = faceArray[f].vertices;

const Vector3& A = vertexArray[index[0]];
const Vector3& B = vertexArray[index[1]];
const Vector3& C = vertexArray[index[2]];

faceNormal[f] = Vector3::Cross(B - A, C - A).Normalize();

Когда я пытаюсь скомпилировать, я получаю сообщение об ошибке:

error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const MyArray<Data>' (or there is no acceptable conversion)
with [Data=Vector3]
c:\...\projects\haziarnyek\hazi\hazi.cpp(502): could be 'Vector3 &MyArray<Data>::operator [](const int &)'
with [Data=Vector3]
while trying to match the argument list '(const MyArray<Data>, int)'
with [Data=Vector3]

faceArray[f].vertices - это массив int.

И vertexArray - это общий массив, который я написал, похожий на:

class MyArray {
public:
    struct element {
        Data data;
        struct element* next;
    };
    element* list;
    element* last;
    int size;
    MyArray(){
        list = new element();
        list->next = NULL;
        last = list;
        size = 0;
    }
    MyArray(int size){
        this->size = size;
        element = new element();
        element* p = list;
        for(int i = 0; i < size; i++) {
            p->next = new element();
            p = p->next;
        }
        p->next = NULL;
        last = p;
    }
    MyArray(const MyArray& o){
        size = o.size;
        element * p = o.list->next;
        list = new element();
        element * p2 = list;
        while (p) {
            p2 = p2->next;
            p2 = new element();
            p2->data = p->data;
            p = p->next;
        }
        p2->next = NULL;
        last = p2;
    }
    Data& operator[](const int& i){
        if (i > size-1) {
            for (int j = 0; j < i-size+1; j++) Push();
            return last->data;
        }
        element* p = list->next;
        for (int j = 0; j < i; i++) {
            p = p->next;
        }
        return p->data;
    }
    void Push(const Data& d) {
        last->next = new element();
        last = last->next;
        last->next = NULL;
        last->data = d;
    }
    void Push() {
        last->next = new element();
        last = last->next;
        last->next = NULL;
    }
    ~MyArray() {
        element* p = list->next;
        element* p2;
        delete list;
        for(;p;) {
            p2 = p;
            p = p->next;
            delete p2;
        }
    }
};

Ответы [ 2 ]

2 голосов
/ 29 ноября 2009

Вы должны определить постоянную версию оператора []:

const x& operator[] (unsigned idx) const;
1 голос
/ 28 ноября 2009

Я так понимаю, контекст первого фрагмента, который вы дали, похож на

void f(const MyArray<Vector3> &vertexArray) {
    ...
}

Ошибка в том, что MyArray не имеет operator[], определенного для постоянных экземпляров. Тот, который у вас не будет, потому что он будет увеличивать количество экземпляров по мере необходимости, поэтому вам нужно будет заполнить следующее и добавить его в MyArray:

const Data& operator[] (int i) const {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...