Создайте вектор publi c, к которому любая функция класса может обращаться и распечатывать содержимое в основном - PullRequest
0 голосов
/ 29 марта 2020

Я довольно новичок в C ++ и пытаюсь написать небольшую программу, в которой строка из функции-члена хранится в векторном массиве c.

Я написал две функции, каждая из которых сохраняет сообщение в этом векторе, однако при попытке вывода содержимого в main ничего не печатается.

classTest.h:

#include <iostream>
#include <vector>

class Test
{
public:
    //std::vector<std::string> buffer
    std::vector<std::string> buffer;

    void msg1();
    void msg2();
};

classTest. cpp:

#include <iostream>
#include <vector>
#include "classTest.h"

void Test::msg1()
{
    Test test;
    std::string message = "HELLO";
    test.buffer.push_back(message);
}

void Test::msg2()
{
    Test test;
    std::string message = "WORLD";
    test.buffer.push_back(message);

}

int main()
{
    Test *test = new Test;

    test->msg1();
    test->msg2();
    std::cout << test->buffer.size() << std::endl;
    //std::cout << test->buffer.at(1) << std::endl;
    //std::cout << test->buffer.at(2) << std::endl;

    return 1;
}

Размер вывода равен 0, и если я пытаюсь test->buffer.at(0), я получаю ошибку вне диапазона.

Все, что я хочу сделать, это пусть функции msg1 и msg2 записывают в буфер publi c и выводят его в консоли в main. Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 29 марта 2020

Проблема в том, что конструктор для вашего класса внутри вашего класса, и это просто не сработает. Вместо этого вы go прямо в свой класс.

void Test::msg1()
{
    std::string message = "HELLO";
    Test::buffer.push_back(message);
}

void Test::msg2()
{
    std::string message = "WORLD";
    Test::buffer.push_back(message);
}
0 голосов
/ 29 марта 2020

test экземпляр в методах msg1() и msg2() являются локальными только для этих методов и go выходят за рамки этих методов.

Итак, вы захотите сделать это :

buffer.push_back( message );

Кроме того, std :: vector является контейнером, начинающимся с нуля, поэтому первым элементом будет at(0) и т. Д.

Другой дело в том, что у тебя утечка памяти. Вы выделяете память, используя оператор new, но не delete после использования. Таким образом, вы должны позаботиться об этом тоже. Еще лучше, используйте умный указатель, например std :: unique_ptr с std :: make_unique для автоматизации c управления памятью.

Вот полный рабочий пример ( live ):

#include <iostream>
#include <vector>

class Test
{
public:
    std::vector<std::string> buffer;

    void msg1();
    void msg2();
};

void Test::msg1()
{
    std::string message = "HELLO";
    buffer.push_back(message);
}

void Test::msg2()
{
    std::string message = "WORLD";
    buffer.push_back(message);
}

int main()
{
    Test *test = new Test;  // memory allocation

    test->msg1();
    test->msg2();
    std::cout << test->buffer.size() << std::endl;
    std::cout << test->buffer.at(0) << std::endl;
    std::cout << test->buffer.at(1) << std::endl;

    delete test;            // memory deallocation
    return 0;
}

Вывод:

2    
HELLO    
WORLD

Соответствующая тема, которую вы можете прочитать: C ++: "std :: endl" vs " \ п "

0 голосов
/ 29 марта 2020

Похоже, вам нужно прочитать хорошую книгу по C ++.

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

Вот обновленные, которые, надеюсь, будут вести себя правильно.

void Test::msg1()
{
    std::string message = "HELLO";
    buffer.push_back(message);
}

void Test::msg2()
{
    std::string message = "WORLD";
    buffer.push_back(message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...