我正在学习c ++,我已经知道了java,c#+++。所以我认为这将是在公园散步,但没有! 我要做的是创建一个简单的对象(“测试”),我可以通过add函数将字符串添加到矢量“data”,然后创建一些打印它的打印函数。我已经尝试过制作下面显示的内容,任何输入都会受到赞赏:)
Call:
test a;
a.add("blabla");
a.print();
test.h:
class test{
vector<string>* data;
std::string str;
public:
test();
void add(std::string t);
};
**test.cpp:**
test::test() {
data = new vector<string>;
}
void test::add(std::string t) {
data->pushback(t);
}
void test::print() {
cout << data[0];
}
答案 0 :(得分:2)
使C ++与Java和C#不同的一个基本原因是,在C ++中,所有类都是“值类”。另一个是动态内存是“手动”。
从第二点开始,每当您致电new
时,您必须考虑谁将及何时致电delete
。
从第一点开始,vector
和string
表现为值,并且处理它们的增长和收缩所需的动态内存由类本身管理。无需动态分配它们。
您还必须处理声明类的标题(必须使用#include
d)以及包含您使用的声明的名称空间(通过声明using
或通过明确地给他们打电话。)
以下代码(在单个文件中)是您想要的。
#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
个方法来处理打印(通过参数化输出流并使&lt;&lt;运算符重载将“a”视为另一个普通值)。
但是现在,将这段代码(与你的代码最相似)与你的代码进行比较,找出不仅仅是语法上不同的代码。
修改
我不知道您是否使用C ++ 11 ... 这里有两种可能的增强:
如果坚持使用C ++ 03,
void add(sd::string t)
可以更好地进行参数化
void add(const std::string& t)
// ^^^^^ ^
如果使用C ++ 11,因为在将其提供给push_back之后不再需要t
,
void test::add(std::string t)
{ data.push_back(std::move(t)); }
并且在这种情况下不要使用const&
。
答案 1 :(得分:0)
您是否记得使用main方法将test.h包含在文件中?
此外,您需要使用std::cout
或在代码中使用行using namespace std;
。
另外,向量的推回方法是push_back()
,而不是pushback()
。
最后,既然您在构造函数中使用了new
关键字,那么您还需要一个析构函数,它看起来像这样:
test::~test()
{
delete data;
}
当您进行C ++编程而不是Java或C#时,这是一个非常重要的事情。 C ++实现不会自动进行垃圾回收,因此您需要自己负责释放已分配的内存。
编辑:
此外,下面的答案之一指出了另一个问题。你没有在索引之前取消引用向量指针。您需要打印(*data)[0]
。故事的道德是,如果您将数据设为vector
而不是指向vector
的指针,那肯定会更容易和更好。
答案 2 :(得分:0)
我想你忘了在test :: print
中取消引用向量指针void test::print() {
cout << (*data)[0];
}
*另外请务必记住删除使用new