新手,帮助制作一个对象

时间:2012-06-20 19:03:31

标签: c++ object vector

我正在学习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];
}

3 个答案:

答案 0 :(得分:2)

使C ++与Java和C#不同的一个基本原因是,在C ++中,所有类都是“值类”。另一个是动态内存是“手动”。

从第二点开始,每当您致电new时,您必须考虑谁将及何时致电delete

从第一点开始,vectorstring表现为值,并且处理它们的增长和收缩所需的动态内存由类本身管理。无需动态分配它们。

您还必须处理声明类的标题(必须使用#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

创建的对象