C ++如果我指向/引用/制作别名,我应该是原始指针(而不是智能)吗?

时间:2015-11-26 15:39:08

标签: c++ pointers

我正在创建一个字符串解析器类,并且有许多子子私有成员函数都需要访问输入。我想避免将输入作为每个函数的参数,例如。

string out = func(input){ sub_func(input) { sub_sub_func(input) } } }

我一直听到原始指针很糟糕,但仍然没有明确回答“仅仅使用指针指向某些东西”的具体情况。我能做到

string m_str //declared as private member
func(string& input) { m_str = move(input) } //member function

string& m_str; //declared as a private member
myclass (string input) : m_str(input); //class construction

但我想做的是

string m_str* //declared as a private member
func(string input) { m_str = input } //member function

问题

  1. 我需要在myclass对象超出范围之前将m_str设置为nullptr(即将其放入类析构函数中)吗?
  2. 我应该使用unique而不是raw指针吗?

3 个答案:

答案 0 :(得分:3)

对于您的第一个问题,不需要“重置”任何成员变量。该对象被破坏,不应再次使用。

对于第二个问题,这取决于。大多数情况下,您可以查看新的智能指针而不是指针,但从资源所有权的角度来看:资源是否可以拥有多个同时拥有者(std::shared_ptr),或者一次只能拥有一个所有者({{1} })?如果您不打算转让所有权,那么除了作为一个不错的自动删除指针之外,不需要真正使用智能指针。你应该问自己的一个更大的问题是,你需要使用指针吗?通常,答案就是“不”。

答案 1 :(得分:1)

  1. 不,您不需要在销毁时将指针类型指定给nullptr

  2. input超出范围后,您的“或”案例会为您提供悬空参考。这是未定义的行为。

  3. 至于使用std::unique_ptr,根据具体情况决定。如果你想拥有多个“拥有”指针的东西,std::shared_ptr可能是更好的选择。

答案 2 :(得分:0)

由于您正在尝试解析std::string,您是否考虑过将迭代器传递给您的函数?那些可以简单地指向字符串中的空格,你的解析器当前正在阅读。

顺便说一下,我对功能中的功能设计不满意。考虑创建一个具有这些函数的类作为私有成员函数。然后你可以将字符串作为类成员,每个函数都可以使用相同的字符串实例。