新手,帮忙制作一个对象
Newbie, help makeing an object
我正在努力学习c++,我已经知道java,c#+++。所以我认为这会在公园里散步,但没有!!我正在尝试做的是制作一个简单的对象("test"),在其中我可以通过 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];
}
使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
方法来处理打印(通过参数化输出流并使<<运算符重载将"a"视为另一个普通值)。但是现在,将这段代码(与您的代码最相似)与您的代码进行比较,并找出不仅语法上不同的地方。
编辑
我不知道你是否在使用C++11...这里有两个可能的增强功能:
如果坚持C++03,
void add(sd::string t)
cand 更好地参数化为
void add(const std::string& t)
// ^^^^^ ^
如果使用 C++11,因为交给push_back后您不再需要t
,
void test::add(std::string t)
{ data.push_back(std::move(t)); }
在这种情况下,不要使用 const&
.
我想你忘了在test::p rint中取消引用矢量指针
void test::print() {
cout << (*data)[0];
}
*同样重要的是要记住删除使用new
创建的对象
您是否记得使用main方法在文件中包含test.h?
此外,您要么需要使用std::cout
,要么在代码中using namespace std;
行。
此外,向量的推回方法是push_back()
,而不是pushback()
。
最后,由于您在构造函数中使用 new
关键字,因此还需要一个如下所示的析构函数:
test::~test()
{
delete data;
}
当你在做C++编程而不是Java或C#时,这是一件非常重要的事情。 C++实现不会自动进行垃圾回收,因此您需要自行释放分配的内存。
编辑:
此外,下面的答案之一指出了另一个问题。您忘记在索引到矢量指针之前取消引用它。 您需要打印出(*data)[0]
. 这个故事的寓意是,如果你将数据作为vector
而不是指向vector
的指针,肯定会更容易和更好。
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 新手,帮忙制作一个对象