使 C++ 与 Java 和 C# 不同的根本原因之一是,在 C++ 中,所有类都是“值类”。另一个是动态内存是“手动”的。
从第二点可以得出这样一个事实:每次你打电话时new
,你必须考虑谁和什么时候打电话delete
。
从第一点开始下降vector
并string
表现为值,并且处理它们的增长和收缩所需的动态内存由类本身管理。无需动态分配它们。
您还必须注意声明类的标头(#include
在使用时必须为 d)和包含您使用的声明的名称空间(通过声明 ausing
或通过显式调用它们)。
以下代码(在单个文件中)执行您想要的操作。
#include <vector>
#include <string>
#include <iostream>
class test
{
public:
void add(std::string t);
void print() const;
private:
typedef std::vector<std::string> data_t;
data_t data;
};
void test::add(std::string t)
{ data.push_back(t); }
void test::print() const
{
for(data_t::size_type i=0; i<data.size(); ++i)
std::cout << data[i] << std::endl;
}
int main()
{
test a;
a.add("first");
a.add("second");
a.add("third");
a.print();
return 0;
}
还有更多canonical
处理打印的方法(通过参数化输出流并制作一个 << 运算符重载,将“a”视为另一个普通值)。但是现在,将这段代码(与您的代码最相似的代码)与您的代码进行比较,并找出不仅仅是语法上的不同。
编辑
我不知道你是否使用 C++11 ......这里有两种可能的增强功能:
如果坚持 C++03,
void add(sd::string t)
可以更好地参数化为
void add(const std::string& t)
// ^^^^^ ^
如果使用 C++11,由于将t
其交给 push_back 后不再需要,
void test::add(std::string t)
{ data.push_back(std::move(t)); }
在这种情况下不要使用const&
.