Руководство с использованием классов / конструкторов

0

Я пишу программу, которая запрашивает у пользователя два вектора (с силой и величиной), а затем возвращает сумму двух векторов. Я действительно не ищу, чтобы кто-то просто дал мне код, но мне действительно нужно руководствоваться тем, как действовать. Я чувствую, что я действительно не понимаю реализации классов/конструкторов, и поэтому я уверен, что делаю что-то неправильно или, по крайней мере, неэффективно. ПРИМЕЧАНИЕ. Надеюсь, что я не закончил. У меня просто есть "блок кодера": P

#include "std_lib_facilities_4.h"

class Physics_vector {
    double force, magnitude, x, y, f, m;
    vector<double> final;
    vector<double> v;

    public:
    Physics_vector(double x, double y) :force(x), magnitude(y) {};
    void set_vector(double f, double m);
    int get_vector(vector<double> final);
    double add_physics_vector();
};

void Physics_vector::set_vector(double f, double m)
{
    f = force;
    m = magnitude;
    vector<double> final;
    final.push_back(f);
    final.push_back(m);
}

int Physics_vector::get_vector(vector<double> final)
{
    for (int i = 0; i < 2; ++i) {
        cout << final[i] << '\n';
    }
    return 0;
}


int main()
{
    cout << "Howdy!" << '\n';
    cout << "This program adds together two vectors."
         << endl;
    cout << "First, enter in the force and magnitude of your first vector." 
         << "\nExample: 4 7." << endl;

    double user_force, user_magnitude, force, magnitude;
    cin >> user_force >> user_magnitude;
    Physics_vector first(user_force, user_magnitude);
    first.set_vector(force, magnitude);

    cout << "Next, enter in the force and magnitude of your second vector."
         << endl;
    cin >> user_force >> user_magnitude;
    Physics_vector second(user_force, user_magnitude);
}

EDIT: Хорошо, поэтому я немного изменил свой код, чтобы сделать его более чистым (если он не сказал мне). Но теперь моя проблема - вызовы функций.

class Physics_vector {
public:
    Physics_vector(double x = 0, double y = 0) :x(x), y(y) {}
    double get_vector(double x, double y);
private:
    double x, y;
};

double Physics_vector::get_vector(double x, double y)
{
    return x;
    return y;
}

double add_physics_vector(vector<double> vect_1, vector<double> vect_2)
{
    return 0.0;
}

int main()
{
    cout << "Howdy! Please enter your first vector (direction and magnitude) ."
        << "\nExample: 1 2." << endl;
    double user_direction = 0;
    double user_magnitude = 0;
    cin >> user_direction >> user_magnitude;
    Physics_vector(user_direction, user_magnitude);
    //get_vector(...aaaand I'm stuck...
}

Как получить get_vector(double x, double y) для использования значений x и y из Physics_vector() качестве аргументов? Я уверен, что это кажется таким рудиментарным для большинства из вас; Я ненавижу, что у меня так много проблем с занятиями...

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

Теги:
class
constructor

3 ответа

0

Если вы получаете эффект, который хотите, вы делаете все хорошо. Однако я не уверен, что это так. Насколько я знаю, вектор в физике - это тело, имеющее величину и направление.

Если вы пытаетесь создать простой класс Physics_vector, я бы, вероятно, придерживался:

class Physics_vector{
    double x, y;

public:
    Physics_vector(double x, double y);
};

Или, если вы хотите работать в N-мерном пространстве:

class Physics_vector{
   unsigned int dimensions; // Optional, same as magnitudes.size();
   vector<double> magnitudes;

public:
   Physics_vector(unsigned int dimensions, ...);
}

Или, в последнем случае - просто используйте шаблоны (возможно, переменные, если вы работаете на С++ 11).

  • 0
    Вы, вероятно, не должны оставлять конструктор закрытым.
  • 0
    @Marian Спасибо, что указали на это. Создание этого public вероятно , поможет :)
0

Похоже, вы, вероятно, должны улучшить свое понимание классов C++ в целом. Здесь хорошее место для начала. Однако я постараюсь дать вам несколько указателей.

  1. Предполагая, что ваш векторный класс должен хранить только два значения, у вас есть путь к многим переменным-членам. Вам на самом деле нужны только два двойника: сила и величина (вы имеете в виду величину и направление?). Переменные vector типа не нужны, так как несмотря на свое имя, std :: vector - это только динамический массив.

  2. Вам не нужен отдельный set_vector() поскольку вы уже устанавливаете значения для своего вектора в конструкторе, передавая там значения силы и величины. С другой стороны, вы можете добавить аксессоров для переменных-членов как get_force() и get_magnitude() а также, возможно, set_force() и set_magnitude() если вы считаете, что можете изменить эти значения извне.

  3. Для добавления векторов вы должны использовать перегрузку оператора и реализовать метод под названием operator+ который позволит вам легко добавить два вектора вместе, просто набрав что-то вроде v3 = v1 + v2.

  4. Это в основном вопрос стиля и его не нужно, но я бы предложил вам добавить какой-то префикс для ваших переменных-членов, поэтому их легко отличить от локальных переменных в коде. Популярным соглашением является использование m_variable. Кроме того, сначала перечисляйте своих публичных пользователей, как правило, упрощает чтение класса.

Учитывая все вышеизложенное, ваш векторный интерфейс может выглядеть так (я оставлю реализацию вам):

class PhysicsVector
{
public:
    PhysicsVector(double force, double magnitude) : m_force(force), m_magnitude(magnitude) 
    {
    }

    double getForce() const;
    double getMagnitude() const;
    void setForce(double force);
    void setMagnitude(double magnitude);

    PhysicsVector operator+(PhysicsVector other) const;

private:
    double m_force, m_magnitude;
}
0

Как правило, классы используются для представления одной единицы данных - в вашем случае - вектора (в физическом смысле). Сам класс должен в идеале содержать только переменные-члены, которым он должен содержать данные, которые он представляет, и (только если это абсолютно необходимо) любые другие части данных, которые должны выполнять его функции-члены. Кажется, вы пытаетесь реализовать вектор, который имеет два измерения, поэтому мы начнем с этого момента.

Во-первых, нам нужно определить минимальные требуемые данные элемента, которые должен выполнять класс для выполнения своей функции. Я считаю, что слишком много думать об этом не делает ничего, кроме того, что класс слишком сложный. В физике вектор в двух измерениях может быть представлен множеством способов, но наиболее распространенной является декартова форма (x, y). Таким образом, для реализации этого требуется только те две переменные. Из этих двух чисел можно рассчитать всю другую информацию об векторе. Чтобы начать объявление класса:

class Physics_vector {

double x, y;

public:
// Constructors and member functions here...
...

Кажется, у вас есть конструктор: все, что ему нужно сделать, это инициализировать эти две переменные. Однако мы можем добавить некоторые дополнительные функции: что, если мы хотим объявить Physics_vector фактически не придав ему значения? Ну, тогда мы могли бы закодировать конструктор, чтобы дать x и y некоторые разумные значения по умолчанию при его построении без каких-либо значений:

...
explicit Physics_vector(double x = 0, double y = 0):x(x), y(y) {}
...

explicit ключевое слово заключается в том, чтобы убедиться, что конструктор должен быть вызван явно, потому что в C++ конструктор, который может принимать один аргумент, также определяет неявное преобразование из этого аргумента в тип класса, а Physics_vector vec = 0; не является разумным преобразованием. Затем нам нужно каким-то образом получить доступ к x и y вне класса, поэтому мы создадим некоторые функции getter и setter, которые будут обращаться к двум значениям:

...
double get_x() const {
    return x;
}

double get_y() const {
    return y;
}

void set_x(double x) {
    this->x = x;
}

void set_y(double y) {
    this->y = y;
}
...

Подумайте о ключевом слове const в качестве обещания, которое вы делаете компилятору, чтобы функция-член не изменяла ни одну из переменных-членов. Вы можете удалить его, и класс все равно будет работать, но обычно его лучше всего включить, когда это имеет смысл.

Синтаксис this->x = x; необходимо потому, что x объявляется дважды в области функций члена setter: один раз в аргументах функции и один раз в переменных-членах классов. Компилятор не может сказать, на что ссылается, поэтому стандарт C++ определяет, что локальная декларация имеет приоритет. Поэтому, пытаясь написать x = x; назначит аргумент функции x самому себе. Я заметил, что ты сделал это случайно в функции set_vector (вы назначили переменный член force к аргументу функции f, и то же самое для m и magnitude, и я не думаю, что вы хотели). Способ обойти это использовать this указатель (который определен в функциях-членах, конструкторах и деструкторах и всегда указывает на текущий экземпляр класса).

Затем мы определим функцию добавления, потому что разумно кодировать добавление двух Physics_vector с классом. Функция должна взять другой Physics_vector и добавить его в *this и вернуть результат.

...
Physics_vector add(Physics_vector other) const {
    return Physics_vector(x + other.x, y + other.y);
}
...

Хотя эта следующая часть более продвинута (и, возможно, еще не была покрыта вашим классом), я все равно ее выложу. Что, если бы мы хотели добавить два Physics_vector как два double? Другими словами, добавьте Physics_vector vec1 и vec2 например Physics_vector result = vec1 + vec2; , Ну, C++ предоставляет способ определения такой операции. Мы бы назвали это так:

...
Physics_vector operator + (Physics_vector other) const {
    return Physics_vector(x + other.x, y + other.y);
}
...

Мы можем также добавить некоторые другие полезные функции, такие как функция, которая возвращает величину Physics_vector.

...
double magnitude() const {
    return sqrt(x*x + y*y);
}
}; // End of the the declaration/definition of Physics_vector.

Функция sqrt определена в заголовке cmath и вычисляет квадратный корень из его аргумента. Магический заголовок std_lib_facilities_4.h который вы включите (возможно, созданный вашим инструктором для вашего удобства), может включать или не включать cmath для вас.

Учитывая этот класс, вы можете реализовать свою программу следующим образом:

int main()
{
    double x1, y1, x2, y2;
    cout << "Please give two vectors to add.\n";
    cout << "x1: ";
    cin >> x1;
    cout << "\ny1: ";
    cin >> y1;
    cout << "\nx2: ";
    cin >> x2;
    cout << "\ny2: ";
    cin >> y2;

    Physics_vector vec1(x1, y1);
    Physics_vector vec2(x2, y2);

    Physics_vector result = vec1.add(vec2); // Or vec1 + vec2, if you use the operator + overload I described.

    cout << "\n\nvec1 + vec2 = ("
         << result.get_x() << ", "
         << result.get_y() << ")";
}

Надеюсь, что поможет вам с блоком программистов!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню