Ссылка и изменение глобальных переменных из классов с помощью указателей - PullRequest
0 голосов
/ 07 декабря 2018

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

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

using namespace std;

class Input
{
public:
    string* textString = new string();

    Input(string uInput)
    {
        textString = &uInput;
    }

    void userInput() {
        cout << "Enter some text - ";
        cin >> *textString;
    }
private:
    // Nothing yet
};


class Output
{
public:
    string* inputText = new string();

    Output(string uInput)
    {
        inputText = &uInput;
    }

    void userOutput() {
        cout << *inputText << endl;
    }
private:
    // Nothing yet
};

int main()
{
    string userInput = "EMPTY";
    cout << &userInput << endl;

    Input i = Input(userInput);
    i.userInput();

    Output o = Output(userInput);
    o.userOutput();

    return 0;
}

Однако, похоже, это не работает.Когда я запускаю это в Visual Studio 2018 и ввожу значение, он ждет пару секунд и печатает «Нажмите любую клавишу, чтобы продолжить ...» и завершает программу.В компиляторе тоже ничего не появляется.Может ли кто-нибудь с большим знанием C ++ помочь мне понять, что не так с моим кодом?Спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

Код неправильно создает объекты i и o.Полагаю, вы могли бы сказать Input *i = new Input(userInput); - это сработало бы, но потребовало бы и дальнейших изменений.

Я изменил ваш Input::userInput(), чтобы получить указатель на строку.Такая же схема указателя на аргумент будет работать для изменения как базовых типов, так и объектов.

Я на самом деле лично не люблю использовать cin и coutЯ бы использовал fgets(), а затем поместил бы значение из этого в вашу строку.

#include <string>
#include <iostream>


class Input
{
    private:
    std::string textString;

    public:
    Input ( std::string uInput )
    {
        textString = uInput;
    }

    void userInput( std::string *intoString )
    {
        std::cout << "Enter some text - ";
        std::getline( std::cin, textString );
        *intoString = textString;
    }
};


class Output
{
    private:
    std::string inputText;

    public:
    Output( std::string uInput )
    {
        inputText = uInput;
    }

    void userOutput()
    {
        std::cout << inputText << std::endl;
    }
};

int main(  )
{
    std::string userInput = "EMPTY";
    std::cout << userInput << std::endl;

    Input i( userInput );
    i.userInput( &userInput );

    Output o( userInput );
    o.userOutput();

    return 0;
}

Мне не совсем ясно, как должен работать объект Input.Локальный textString кажется избыточным, но я все равно пытался его использовать.

...