当我们不想用对象调用时,如何编写和调用没有对象的函数

时间:2011-07-18 12:13:52

标签: c++

我正在使用不同的类以及与这些不同类相关的对象。现在,我想编写一个单独的函数,用于将两个向量联合到另一个向量。我应该在哪里编写这些类型的单独函数。我可以使用新的头文件吗?实际上,我创建了一个新的头文件(ConnectedSegment.h)并将我的函数置于其下。但是,我收到了这个错误。

43 D:myex\ConnectedSegment.h non-member function `std::vector<int>& NeighboursToGivenValue(std::map<int, std::vector<int> >&, int, int)' cannot have `const' method qualifier 

D:\myex\Detects\Makefile.win [Build Error]  [Detects.o] Error 1 

这是我的功能代码:

vector<int> & NeighboursToGivenValue(map<int, vector<int> > &adjacency, 
                                              int s1, int s2) const
{
  vector<int>::const_iterator any;
  vector<int>::iterator is_any;
  vector<int> *neighbours2both = new vector<int>;
  int i;

  neighbours2both->reserve(adjacency[s1].size() + adjacency[s2].size());
  neighbours2both->insert(neighbours2both->end(), adjacency[s1].begin(),adjacency[s1].end ());

  vector<int>& neighbours2s2=adjacency[s2];        
  for (any=neighbours2s2.begin(); any!=neighbours2s2.end(); any++){            
       is_any = find (neighbours2both->begin(), neighbours2both->end(), *any);           
       if(is_any == neighbours2both->end()){
          if(s1 != *any) neighbours2both->push_back(*any);
       }
  }
  for (i=0; i<neighbours2both->size(); i++){
       neighbours2both->erase(neighbours2both->begin() + i);
  }
  return(*neighbours2both);
}

在这里,我通过使用另一个名为adjacency()的类获得了MyPoint的值。 所以我使用myxyz.adjacency()来设置此邻接的值。现在我不想为调用函数MyPoint调用同一个类NeighboursToGivenValue。所以, 你能告诉我在哪里写这个功能吗?或者,如果我在MyPoint类中编写此函数,如何在没有该类对象的情况下调用此函数。

1 个答案:

答案 0 :(得分:1)

这些 free 函数可以在标题中(需要在其注释中将Pedro高亮显示为inline) - 或者它们可以在标题中声明并在实现中定义文件 - 例如,

#header

vector<int>& join_int_vector(vector<int> const& lhs, vector<int> const& rhs);

# cpp

vector<int>& join_int_vector(vector<int> const& lhs, vector<int> const& rhs)
{
 // do stuff
}

你面临的问题是你只能拥有const成员函数 - 即自由函数(和静态函数)不能是const - 它没有任何意义。

顺便说一句。不动态构造向量并返回对它的引用,即:

vector<int> *neighbours2both = new vector<int>;
:
return (*neighbours2both);

被调用者无法意识到需要手动清理此对象 - 在这种情况下,按值返回。

vector<int> join_int_vector(vector<int> const& lhs, vector<int> const& rhs)
{
  vector<int> neighbours2both;
  :
  return neighbours2both;
}

编辑:对于标题本身定义的函数,如下所示:

inline vector<int> join_int_vector(vector<int> const& lhs, vector<int> const& rhs)
{
  vector<int> neighbours2both;
  :
  return neighbours2both;
}

请注意使用关键字inline - 如果此标头包含在多个翻译单元中,则可以防止出现多个定义错误。