Функции-члены класса для новичка 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
указатель.