0

我正在学习c++,我已经知道java,c#+++。所以我认为这将是在公园里散步,但没有!我要做的是制作一个简单的对象(“t​​est”),我可以在其中通过 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];
}
4

3 回答 3

2

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

从第二点可以得出这样一个事实:每次你打电话时new,你必须考虑谁和什么时候打电话delete

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

您还必须注意声明类的标头(#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&.

于 2012-06-20T19:54:23.200 回答
0

你还记得在你的 main 方法中包含 test.h 吗?

此外,您需要在代码中使用std::cout或包含该行using namespace std;

另外,vector 的推回方法是push_back(),不是pushback()

最后,由于您new在构造函数中使用了关键字,因此您还需要一个析构函数,它看起来像这样:

test::~test()
{
    delete data;
}

当您进行 C++ 编程而不是 Java 或 C# 时,请记住这一点非常重要。C++ 实现不会自动进行垃圾收集,因此您需要自行释放分配的内存。

编辑:

此外,以下答案之一指出了另一个问题。您忘记在索引矢量指针之前取消引用它。你需要打印出来(*data)[0]。故事的寓意是,如果您将数据设为 avector而不是指向vector.

于 2012-06-20T19:06:45.643 回答
0

我想你忘了取消引用 test::print 中的向量指针

void test::print() {
    cout << (*data)[0];
}

*另外重要的是要记住删除创建的对象new

于 2012-06-20T20:02:36.807 回答