Как вы можете использовать векторы и целые числа как конструкторы для класса - PullRequest
1 голос
/ 15 октября 2011

Если бы у меня был класс foo, тогда

class foo{
   vector <int> vec;
   int someint;

   public:
   foo(number n): someint(n){}


}

Как бы я написал конструктор для vector, для class foo?Более того, я могу использовать:

int get_someint() const{

  return someint;
}

Для возврата int, но как насчет векторов?

Ответы [ 3 ]

2 голосов
/ 15 октября 2011

При работе со сложными типами данных обычно лучше всего работать со ссылками или константными ссылками, например:

class A
{
public:
    A()  {}  // default construct of A, v_ is empty

    A(const std::vector<int>& source)
      : v_(source)  // construct A, given a vector that is 
                    // copied into v_
    {
    }

    // returns an immutable reference to v_
    const std::vector<int>& get_v() const
    {
       return v_;
    }

    // returns a mutable reference to v_
    std::vector<int>& get_v()
    {
        return v_;
    }
private:
    std::vector<int> v_;
};

Пример использования:

A a_no_vec;  // A has an empty vector v_

std::vector<int> src;

src.push_back(16);
src.push_back(19);

A a_with_vec(src);  // A has a vector that is a copy of src
0 голосов
/ 15 октября 2011

Вам не нужно писать конструктор для вектора.Вектор уже имеет свои конструкторы.Также вы можете просто вернуть вектор, когда вы возвращаете свой int, например

const std::vector<int> & getVec()
{
   return vec;
}
0 голосов
/ 15 октября 2011

Вы можете сделать это точно так же. Для всех целей рассматривайте vector<int> как нормальную переменную (например, int), поэтому вы можете написать:

class foo{
   vector <int> vec;
   int someint;

   public:
   foo(number n, vector<int> v): someint(n), vec(v){}
}

Он будет копироваться изнутри и снаружи, и это может означать много копий памяти. Вот почему для таких больших объектов используется передача по ссылке (либо по указателю, либо по ссылке). Например, чтобы вернуть вектор:

vector<int> const& the_vector()
{ return inner_vector; } // no copy

и конструктор также будет foo(number n, vector<int> const& v). Кроме того, если внутренне вам не нужно хранить копию вектора, вы можете использовать указатель или ссылку на этот вектор в качестве члена, вместо самой копии вектора, то есть класса:

class foo{
   vector <int>& vec;
   int someint;

   public:
   foo(int n, vector<int>& v): someint(n), vec(v){}
}

(обратите внимание на ссылки). То же самое с указателями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...