оператор this в c ++? - PullRequest
       1

оператор this в c ++?

0 голосов
/ 28 января 2011

Извините, не уверен, что об этом уже спрашивали, я действительно не знаю, что искать.Я новичок в C ++ с Java.Когда мы хотим вызвать функцию на объекте в Java, мы говорим picture.rotateRight();

Тогда в rotateRight() у нас будет что-то вроде int height=this.getHeight();.Тем не менее, как мы делаем это в C ++?У меня есть метод с именем invertcolors();, а затем у меня есть что-то вроде:

Image* myImage = new Image();
bool b = myImage->ReadFromFile("in_01.bmp");
myImage->invertcolors();

void invertcolors(){
    int width=TellWidth();
    int height=TellHeight();
    ...
}

Как мне получить доступ к myImage из определения метода, фактически не сказав myImage (так как это имя впоследствии может быть изменено),

Кроме того, параметры функции не подлежат обсуждению.

Ответы [ 7 ]

5 голосов
/ 28 января 2011

Прежде всего, ваше определение функции invertcolors() не является функцией-членом. Несмотря на то, что вы объявили его внутри класса Image, вы никак не связали реализацию с классом, поэтому компилятор считает ее функцией, не являющейся членом. Чтобы сделать его членом Image, вам нужно использовать Image::invertcolors следующим образом:

void Image::invertcolors(){
    int width=TellWidth();
    int height=TellHeight();
    ...
}

Вы получаете this в C ++, но это указатель, поэтому вы должны использовать this->getHeight() в C ++. Тем не менее, обратите внимание, что это избыточно в этом случае. Как новичок вы, вероятно, найдете единственное реальное применение в методе, имеющем то же имя аргумента, что и атрибут. В этом случае вам нужно будет использовать this->height = height например. Тем не менее, обратите внимание, что здесь C ++ имеет хорошее дополнение синтаксиса. Этот код делает то же самое, что и простой установщик:

void Image::setHeight(int height): height(height) {}

Обратите внимание, что ни в Java, ни в C ++ оператор this не является. ., -> и + являются примерами операторов.

2 голосов
/ 28 января 2011

this - это ключевое слово, а не operator, и оно существует в C ++.Это указатель, поэтому вы будете использовать его с ->, а не с . при доступе к членам.

1 голос
/ 28 января 2011

Внутри функции-члена this->whatever неявно, так что вы можете просто использовать whatever самостоятельно, и компилятор выяснит, что вы имеете в виду this->whatever. Есть несколько случаев (в основном в шаблонах), в которых может иметь смысл использовать this-> и в C ++, но это крайне редко необходимо (я знаю время, но после написания C ++ в течение нескольких десятилетий я вероятно, еще могу посчитать, сколько раз я делал это на пальцах).

Если ваш код не входит в функцию-член, то он должен явно ссылаться на некоторый конкретный объект (как в Java).

0 голосов
/ 28 января 2011

Читая комментарии, вам не хватает, как определить метод:

Заголовочный файл: Image.h

class Image : public BMP {

public:

    void invertcolors();
};

Исходный файл Image.cpp

void Image::invertcolors()
{
    int width=TellWidth();
    int height=TellHeight();
    // ...
}
0 голосов
/ 28 января 2011

Предполагая, что invertcolors(), TellWidth() и TellHeight() являются функциями-членами класса Image, он будет работать так же, как вы его написали.

В C ++ this - это константный указатель на объект, для которого был вызван метод (в отличие от Java, где this является ссылкой). Итак, а не:

this.doSomething(); // in Java

вы бы сказали:

this->doSomething(); // in C++.
0 голосов
/ 28 января 2011

РЕДАКТИРОВАТЬ: Извините, не видел часть о параметрах. Новый ответ: Если параметры функции не подлежат обсуждению, и вы не можете определить invertColors как функцию-член для Image (путем расширения класса Image), тогда вам потребуется глобально определенная переменная.

Вне вашей основной функции объявите Image * myimg;

затем используйте myimg как обычно внутри вашей функции.

например:

Image* myImg;
int main()
{
    ..all your initialization, etc. 
    invertColors();
}

void invertColors()
{
     int width = myImg->width;
     ...
}
0 голосов
/ 28 января 2011

«Это» также доступно в C ++. Это указатель на объект, для которого вызывается функция.

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