Получатель класса C ++ не возвращает никакого значения в main, но делает ли это в классе? - PullRequest
1 голос
/ 19 марта 2019

Я надеюсь, что кто-то может указать мне направление, почему моя функция получения не может быть доступна должным образом, когда она используется вне функции, в которой объявлен установщик.

Я читаю в файле, сохраняю переменные каждой строки, используя функцию getline, а затем присваиваю сообщение частной переменной в Message.h .

Когда я набираю m1.getmessage() в функции readfile(), она выводит абсолютно нормально, с правильным выводом (строка сообщения из моего текстового файла), однако это j только дает пустой вывод in main(). Я пытался разобраться с этим уже несколько часов, я читал о локальных переменных, но насколько я вижу, переменная уже установлена, и в публичной функции, поэтому я не вижу где я иду не так. Любая помощь будет очень признателен, прежде чем я доберусь до вина в 4 часа утра. * 10101 *

Message.h

#include <iostream>

class Message {
private:
std::string message;
std::string cipher;


public:
    void readFile();

    void setMessage(std::string msg) {
        message = msg;
    }
    void setCipher(std::string ciph) {
        cipher = ciph;
    }

    std::string getMessage() {
        return message;
    }
    std::string getCipher() {
        return cipher;
    }
};

message.cpp

#include "Message.h"
#include <fstream>
#include <iostream>

void Message::readFile()    {
    std::string fileUsername;
    std::string fileForename;
    std::string fileSurname;
    std::string fileAge;
    std::string fileTime;
    std::string fileHour;
    std::string fileMin;
    std::string fileSec;
    std::string fileCipher;
    std::string fileMessage;
    Message m1;
    std::fstream file;
    std::string filename;
    std::cout << "Please enter file name: " << std::endl;
    getline(std::cin, filename);
    file.open(filename);
    if (file.is_open()) {
        std::cout << "File opened" << std::endl;
    } else {
        std::cout << "Wrong file name" << std::endl;
    }
    while(file.is_open()) {

        getline(file, fileUsername);
        getline(file, fileForename);
        getline(file, fileSurname);
        getline(file, fileAge);
        getline(file, fileHour, ':');
        getline(file, fileMin, ':');
        getline(file, fileSec);
        getline(file, fileCipher);
        getline(file, fileMessage);
        file.close();
    }
    m1.setMessage(fileMessage);
    m1.setCipher(fileCipher);
    m1.getMessage();

};

main.cpp

#include <iostream>
#include <iomanip>
#include <fstream>
#include "Message.h"
#include "Caesar.h"
#include "XOR.h"


int main() {

    Message m1;
    m1.readFile();
    std::cout << m1.getMessage();


    return 0;
}

Cout в main ничего не возвращает, тогда как если я перенесу его в m1.readfile (), он отлично выведет переменную.

Это моя первая попытка объектно-ориентированного программирования, и это определенно мое слабое место. Заранее спасибо за любой совет.

Ответы [ 4 ]

2 голосов
/ 19 марта 2019

В функции Message::readFile() вы вызываете не функции setMessage и setCipher для текущего объекта, а для локальной переменной m1.Локальная переменная отбрасывается в конце функции, и сообщение и шифр не сохраняются.Вместо этого вы должны просто вызвать

setMessage(fileMessage);
setCipher(fileCipher);
getMessage();

вместо

m1.setMessage(fileMessage);
m1.setCipher(fileCipher);
m1.getMessage();

. Это обновит переменные сообщения и шифра текущего объекта, и вы сможете затем напечатать getMessage() из mainфункция.

0 голосов
/ 19 марта 2019

Вы можете использовать this ;указатель на объект, над которым вы сейчас работаете.как показано ниже.

this->setMessage(fileMessage);

или

(*this).setMessage(fileMessage);
0 голосов
/ 19 марта 2019

Вам не нужно создавать объект внутри функции-члена этого класса

Мое предложение:

  • Пропустить / Удалить Message m1; в readFile()
  • Непосредственно называть функции как

    setMessage(fileMessage); setCipher(fileCipher); getMessage();

0 голосов
/ 19 марта 2019

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

...