не знаком с указателем c ++, нужна помощь - PullRequest
0 голосов
/ 23 сентября 2011

в строке *binSon[0].add(x);, выдает ошибку, выражение должно иметь тип класса, что мне делать?

struct Rectangle
{
    tName Name; //name of the rectangle
    struct Rectangle *binSon[NDIR_1D]; //left and right son
    int Center[NDIR_1D];
    int Length[NDIR_1D];

    void add(Rectangle x){
        if(strcmp(x.Name,Name)<0)
        {
            if(binSon[0]==NULL)
                binSon[0]=&x;
            else
                *binSon[0].add(x);

        }else{
            if(binSon[1]==NULL)
                binSon[1]=&x;
            else
                *binSon[1].add(x);
        }
    }
};

Ответы [ 4 ]

5 голосов
/ 23 сентября 2011

У вас небольшая проблема с приоритетом. Любое из следующего должно решить проблему:

(*binSon[0]).add(x);

или

binSon[0]->add(x);

То же относится и к другой строке.

2 голосов
/ 23 сентября 2011

Ваша проблема здесь не совсем то, о чем вы думаете, хотя она может быть решена как есть.

Синтаксис правильный :

binSon[0]->add(x);

Оператор -> является членом-указателем, который обрабатывает все для вас. Как правило, -> следует использовать с указателями, а . - со ссылками или самим объектом (исключения находятся в интересных местах).

Чтобы сделать это так, как вы хотите (чего на самом деле не следует), (*binSon[0]).add(x) должен работать. Приоритет оператора, вероятно, является вашей проблемой на данный момент.

2 голосов
/ 23 сентября 2011

В C ++ . имеет более высокий приоритет, чем *, поэтому, когда вы пишете *binSon[1].add(x), это означает *(binSon[1].add(x)), что не то, что вам нужно. Вы можете написать (*binSon[1]).add(x) или лучше binSon[1]->add(x), что является синтаксическим сахаром для него.

2 голосов
/ 23 сентября 2011

Возможно, вы хотите (*binSon[0]).add или еще лучше binSon[0]->add.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...