2017-02-14 12 views
0

Я хочу получить прямой доступ к вектору BigArray::v, который является членом класса, и распечатайте его. Но компилятор не будет строить свой код:Как получить прямой доступ к члену векторных данных класса и распечатать его?

#include <iostream> 
#include <vector> 
using namespace std; 

class BigArray 
{ 
private: 

    vector<int> v={1,2,3,4,5,6,7,8,9,10}; 
    int accessCounter; 
public: 
    const vector<int> & getVector() const {return v;} 
}; 


int main(int argc, const char * argv[]) { 
    // insert code here... 
    BigArray b; 
    cout<< *b.getVector()<< endl; 
    return 0; 
} 
+3

Похоже, вы могли бы использовать [хороший C++ книги] (http://stackoverflow.com/questions/388242/the-definitive- c-book-guide-and-list) – NathanOliver

+1

Вы пытаетесь разыменовать «вектор», а затем распечатываете его. – LWimsey

+1

Вы должны были видеть из [гораздо более простого кода, подобного этому] (http://ideone.com/n5UO7k), который вы не может «печатать вектор», используя просто 'cout' и вектор. Поэтому сначала разрешите эту простую задачу перед тем, как вводить классы в микс. – PaulMcKenzie

ответ

1

Есть два вопроса:

  1. b.getVector() возвращает ссылку на вектор, поэтому при использовании *b.getVector() попытки разыменования ссылки, которая инвалид. Вероятно, вы использовали только b.getVector() вместо *b.getVector().

  2. Нет перегрузки для потоковой передачи вектора в std::ostream, например std::cout. Вы должны написать свой собственный, например:

#include <iostream> 
#include <vector> 
using namespace std; 

class BigArray { 
private: /* Fields: */ 
    vector<int> v={1,2,3,4,5,6,7,8,9,10}; 
    int accessCounter; 
public: /* Methods: */ 
    const vector<int> & getVector() const {return v;} 
}; 

template <typename T> 
std::ostream & operator<<(std::ostream & os, std::vector<T> const & v) { 
    bool first = true; 
    os << '{'; 
    for (auto const & elem : v) { 
     if (!first) { 
      os << ", "; 
     } else { 
      first = false; 
     } 
     os << elem; 
    } 
    return os << '}'; 
} 

int main(int argc, const char * argv[]) { 
    // insert code here... 
    BigArray b; 
    cout<< b.getVector() << endl; 
    return 0; 
} 
+0

Ваша петля никогда не устанавливает 'first' в false, поэтому' ',' 'не выводится между элементами. Вам нужно перенести «первое» назначение из блока 'if' или, по крайней мере, в' else'. Кроме того, вы можете использовать 'std :: copy()' и 'std :: ostream_iterator' вместо использования ручного цикла. Пусть дескриптор 'std :: ostream_iterator' разделяет элементы для вас, например:' template std :: ostream & operator << (std :: ostream & os, std :: vector const & v) {os << '{'; std :: copy (v.begin(), v.end(), std :: ostream_iterator (os, ",")); return os << '}'; } ' –

+0

@RemyLebeau Исправлена ​​обработка' first'. Вы правы, что 'std :: copy' /' std :: ostream_iterator' thingie является альтернативой (и даже лучшей альтернативой). Однако, какой из них, по вашему мнению, лучше всего поймет OP в этот момент? – jotik