我对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
函数写入公共缓冲区,并在主控制台中输出。任何帮助都将不胜感激。
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);
}