设计任何类函数都可以访问和打印主内容的公共向量



我对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),我会得到一个超出范围的错误。

我所想做的就是让msg1msg2函数写入公共缓冲区,并在主控制台中输出。任何帮助都将不胜感激。

方法msg1()msg2()中的

test实例仅在这些方法的本地,并且在这些方法退出时超出范围。

所以,你会想这样做:

buffer.push_back( message );

此外,std::vector是一个基于零的容器,因此第一个元素将是at(0),依此类推

另一件事是你在泄露记忆。使用new运算符分配内存,但使用后不使用delete运算符。所以,你也需要注意这一点。更好的是,使用智能指针,例如std::unique_ptr和std::make_unique来进行自动内存管理。

以下是一个完整的工作示例(实时(:

#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";\n〃;

你需要读一本关于C++的好书。

成员函数对一个名为test的局部变量进行操作,该变量在函数结束时消失。

以下是更新后的,希望能正确运行。

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

问题是类的构造函数,在类内部,这是不起作用的。相反,你直接去上课。

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

最新更新