Здравствуйте. Какой способ получения контейнера из класса предпочтительнее для каждого из вариантов списка:
- по значению;
- без копирования, с возможностью редактирования полученного контейнера;
- без копирования и без возможности редактирования.
#ifndef MYCLASS_H
#define MYCLASS_H
#include <vector>
class MyClass
{
public:
MyClass();
std::vector<int> getVec0();
std::vector<int> &getVec1();
const std::vector<int> &getVec2();
void getVec3(std::vector<int>::iterator &itBeg, std::vector<int>::iterator &itEnd);
void getVec4(std::vector<int>::const_iterator &itBeg, std::vector<int>::const_iterator &itEnd);
void getVec5(std::vector<int> &vec);
void getVec6(std::vector<int> *vec);
private:
std::vector<int> myVec;
};
#endif // MYCLASS_H
И ещё вопросик, насколько допустимо объявление структур и функций не являющихся членами класса в *.h, но используемых в реализации функций-членов в *.cpp? Например, есть у меня обёртка для функций boost::spirit, заголовочные файлы и структуры, определяющие грамматики, объявлены только в parser.cpp и никак не фигурируют в parser.h.
/* parser.h */
//...
class MyParser
{
public:
void getMyCon(string str, vector<int>::const_iterartor &itBegin, vector<int>::const_iterator &itEnd);
private:
vector<int> myCon;
};
//...
/* parser.cpp */
#include "myparser.h"
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
//...
void foo(vector<int> &vec, int val)
{
//...
}
template <typename Iterator>
struct MyGrammar
: qi::grammar<Iterator, vector<int>(), qi::space_type>
{
//...
};
void MyParser::getMyCon(string str, vector<int>::const_iterartor &itBegin, vector<int>::const_iterator &itEnd)
{
//...
}