新手,帮忙制作一个对象

Newbie, help makeing an object

本文关键字:一个对象 新手      更新时间:2023-10-16

我正在努力学习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

从第一点开始,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方法来处理打印(通过参数化输出流并使<<运算符重载将"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的指针,肯定会更容易和更好。

相关文章: