Функции-члены класса для новичка C++

Я новичок в C++, и в настоящее время я готовлюсь к экзаменам, возлюсь с C++ в VisualStudio и немного экспериментирую. Обычно я работаю с Java.

Я написал простой класс, чтобы увидеть, как и если все работает:

class Point
{
private:
    int x;
    int y;

public:
    Point(int arg1, int arg2)
    {
        x = arg1;
        y = arg2;
    }
};

Я попробовал 2 простые функции-члены для x и y, чтобы просто удвоить значение, хранящееся в переменных x и y.

Сначала я попробовал это:

void doubleX()
{
    x *= 2;
};

void doubleY()
{
    y *= 2;
};

Тогда я попробовал это:

void doubleX()
{
    Point::x = 2 * Point::x;
};

void doubleY()
{
    Point::y = 2 * Point2::y;
};

Оба помещены в определение класса.

При сборке через VisualStudio он также выдает мне предупреждение об ошибке: "Ошибка C3867" Point:: doubleX ": нестандартный синтаксис; используйте" & "для создания указателя на член"

Пыталась также возиться с указателями адресов, но... я понятия не имею. Я думаю, что знаю, как в основном работают указатели, но я понятия не имею, как использовать его для моего случая здесь.

Любое быстрое решение и объяснение этой проблемы?

Заранее спасибо!

РЕДАКТИРОВАТЬ: вот весь мой код, проблема в основном сейчас

    #include "stdafx.h"
#include <iostream>

using namespace std;

class Point
{
public:
    int x;
    int y;

    Point(int arg1, int arg2)
    {
        x = arg1;
        y = arg2;
    }

    void doubleX()
    {
        x *= 2;
    };

    void doubleY()
    {
        y *= 2;
    };
};

int main()
{
    Point p(1,1);

    int &x = p.x;
    int &y = p.y;

    cout << x << "|" << y;

    p.doubleX; p.doubleY; //error message here

    cout << x << "|" << y;

    cin.get();
}

4 ответа

Решение

Может быть, вы не объявили функции-члены внутри определения класса? Вот полный рабочий пример, основанный на вашем классе:

#include <iostream>


class Point
{
private:
    int x;
    int y;

public:
    Point(int arg1, int arg2)
    {
        x = arg1;
        y = arg2;
    }

    void doubleX()
    {
        x *= 2; /* or this->x *= 2; */
    }

    void doubleY()
    {
        y *= 2;
    }

    int getX()
    {
        return x;
    }

    int getY()
    {
        return y;
    }
};


int main()
{
    Point p(2, 3);

    std::cout << "p.x = " << p.getX() << " | p.y = " << p.getY() << std::endl;

    p.doubleX();
    p.doubleY();

    std::cout << "p.x = " << p.getX() << " | p.y = " << p.getY() << std::endl;

    return 0;
}

Вы можете положить это в main.cpp файл, скомпилируйте и запустите его. Я проверил это с g++ компилятор и работает нормально.

Ответ, данный Валием, правильный. Но я хотел бы напомнить вам, что C++ предлагает вам другой выбор объявления и определения методов, а именно: объявление метода внутри объявления класса и определение их вне объявления класса. Это позволяет легко разделить интерфейс и реализацию на .h а также .cpp файлы соответственно, как показано ниже:

Point.h

class Point
{
private:
    int x;
    int y;

public:
    Point(int arg1, int arg2);
    void doubleX();
    void doubleY();
    int getX();
    int getY();
};

Point.cpp

#include "Point.h"

Point::Point(int arg1, int arg2)
{
    x = arg1;
    y = arg2;
}

void Point::doubleX()
{
    x *= 2;
}

void Point::doubleY()
{
    y *= 2;
}

int Point::getX()
{
    return x;
}

int Point::getY()
{
    return y;
}

// PointTest.cpp

#include "Point.h"

int main()
{
    // Do something with Point here
    Point pt(1, 2);

    std::cout << "Original: (" << pt.getX() << ", " << pt.getY() << ")" << std::endl;

    pt.doubleX();
    pt.doubleY();

    std::cout << "After being doubled: (" << pt.getX() << ", " << pt.getY() << ")" << std::endl;

    return 0;
}

И, как скомпилировать:

g++ -o PointTest PointTest.cpp Point.cpp

Не могу комментировать из-за репутации, но, похоже, vC++ выводит сообщение об ошибке, которое вы указали при попытке вызова

Point::doubleX

Вот живой пример вывода: http://rextester.com/ZLCEW66682

Вы должны создать экземпляр класса и вызвать функцию, используя parens

В вашем втором наборе функций

void doubleX()
{
    Point2::x = 2 * Point2::x;
};

void doubleY()
{
    Point2::y = 2 * Point2::y;
};

Если вы хотите, чтобы они были членами-членами класса Point, Point::y... это не то, как вы должны получить доступ к данным участника. Только статические переменные-члены могут быть доступны таким образом. Правильный путь

void doubleX()
{
    this->x = 2 * this->x;
};

void doubleY()
{
    this->y = 2 * this->y;
};

Что использует this указатель.

Другие вопросы по тегам