Форум программистов, компьютерный форум CyberForum.ru

Передача вектора из класса в класс? - C++

Восстановить пароль Регистрация
 
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 18:33     Передача вектора из класса в класс? #1
Доброго времени суток! У меня возникла проблема в очень простой программе. Я передаю функции из класса board.cpp в класс test.cpp.
У меня выдает g++ следующую ошибку:
XML
1
2
3
4
/tmp/cc7v3lIw.o: In function `main':
test.cpp:(.text+0x20): undefined reference to `Board::read_grid(int)'
test.cpp:(.text+0x5f): undefined reference to `Board::print_grid(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >)'
collect2: ld returned 1 exit status


вот мой код:
class board.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include "board.h"
using namespace std;
 
vector<vector<int> > read_grid(int);
void print_grid(vector<vector<int> >);
 
vector<vector<int> > Board::read_grid(int size)
{
    vector<vector<int> > v(size);
    
        for(int i = 0; i < size; ++i)
    {
            vector<int> w(size, 0);
            v.at(i) = w;
            
    }
 
 
    ifstream infile("example");
    int x;
    int g = 0;
    int checkLine = 0;
    for (int f = 0; f < size; ++f)
    {
        while ( g < size && infile >> x )
        {
            cout << "This is x: " << x << endl;
        
            if (g < size)
            {
                v.at(f).at(g) = x;
                g += 1;
            }
    
        }
        g = 0;
    }
    return v;
}
 
void Board::print_grid(vector<vector<int> > v)
{
    for(unsigned int i = 0; i < v.size(); ++i)
    {
        for(unsigned int j = 0; j < v.at(i).size(); ++j)
        {
            cout << v.at(i).at(j) << " ";
        }
        cout << "\n";
    }
    cout << "\n";
}
 
int main(void)
{
    int grid_size = 9; 
    int iterations;
    vector<vector<int> > grid = read_grid(grid_size);
    print_grid(grid);
}
class board.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <vector>
#include <iostream>
 
class Board
{
public: 
    
    std::vector<std::vector<int> > read_grid(int);  
    void print_grid(std::vector<std::vector<int> > v);
    std::vector<std::vector<int> > grid;
    
};
и наконец меню класс test.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "board.h"
#include <vector>
#include <iostream>
 
using namespace std;
Board newBoard;
 
int main(void)
{
    int grid_size = 9; 
    newBoard.grid = newBoard.read_grid(grid_size);
    newBoard.print_grid(newBoard.grid);
}
простите за гору кода, просто правда уже полдня пытаюсь найти ошибку. Спасибо вам огромное заранее за помощь!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
28.09.2013, 19:13     Передача вектора из класса в класс? #2
ну, board.cpp и test.cpp не классы)
Цитата Сообщение от broboa Посмотреть сообщение
v.at(i) = w;
Зачем at?) выход за границы ты все равно никак не обрабатываешь, да его у тебя и не будет, так что можно и через обычные [].
Совет: подключи
C++
1
using namespace std;
в .h, зачем захламлять код std::)
Может, include guard нужно в .h? Типа:
C++
1
2
3
4
#ifndef __BOARD_H__
#define __BOARD_H__
....
#endif
ну, или #pragma once, как альтернатива.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.09.2013, 19:14     Передача вектора из класса в класс? #3
у вас две функции main. но дело не в этом.
похоже вы собираете только один файл test.cpp.
компилятор увидел объявление класса и все что нужно сделал. а вот линкер - нет.
линкеру нужно сказать, чтобы он компоновал программу из двух объектных файлов:
test.cpp и board.cpp. после этого линкер начнет ругаться на две функции main.
из board.cpp ее нужно убрать. там только определения методов класса Board.
строки 8 и 9 в боард.спп - лишние. это объявления свободных функций и
определений нет. и нигде вроде нет попыток использовать эти свободные функции.
все остальное тоже криво , но вы сперва со сборкой бинаря разберитесь.

и не слушайте совет на счет написания using namespace std; в h. это плохой совет,
так делать не стоит.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,283
28.09.2013, 19:20     Передача вектора из класса в класс? #4
а вы cpp файл к проекту добавили?
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 19:20  [ТС]     Передача вектора из класса в класс? #5
спасибо большое за помощь, сейчас попробую и отпишусь. Насчет метода main, это я его откомментить забыл, прошу прощение
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 19:24     Передача вектора из класса в класс? #6
Цитата Сообщение от broboa Посмотреть сообщение
C++
1
void Board::print_grid(vector<vector<int> > v)
зачем весь вектор передавать в функцию которая просто печатает его содержимое? ведь можно передать ссылку или указатель. и не будет лишнего копирования и сама программа будет быстрее работать
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 19:33  [ТС]     Передача вектора из класса в класс? #7
Цитата Сообщение от _ Посмотреть сообщение
зачем весь вектор передавать в функцию которая просто печатает его содержимое? ведь можно передать ссылку или указатель. и не будет лишнего копирования и сама программа будет быстрее работать
не могли бы показать на примере как сослать вектор?

Добавлено через 1 минуту
Цитата Сообщение от DU Посмотреть сообщение
похоже вы собираете только один файл test.cpp.
компилятор увидел объявление класса и все что нужно сделал. а вот линкер - нет.
линкеру нужно сказать, чтобы он компоновал программу из двух объектных файлов:
test.cpp и board.cpp.
так делать не стоит.
Не очень понимаю как это все реализовать. Да и вообще не понимаю что вы имеете ввиду? можно с примером пожалуйста? Все остальное поправил! Спасибо
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 19:37     Передача вектора из класса в класс? #8
Цитата Сообщение от broboa Посмотреть сообщение
не могли бы показать на примере как сослать вектор?
просто звездочку поставить перед v
C++
1
void Board::print_grid(vector<vector<int> > *v)
теперь эта функция принимает указатель
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 19:50  [ТС]     Передача вектора из класса в класс? #9
Цитата Сообщение от _ Посмотреть сообщение
просто звездочку поставить перед v
C++
1
void Board::print_grid(vector<vector<int> > *v)
теперь эта функция принимает указатель
ну а так чтобы принять это значение в test.cpp, мне там тоже надо звездочку поставить? или где-то еще?
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
28.09.2013, 19:52     Передача вектора из класса в класс? #10
Цитата Сообщение от _ Посмотреть сообщение
теперь эта функция принимает указатель
ссылку применяй - ссылкуууу
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 19:55     Передача вектора из класса в класс? #11
Цитата Сообщение от Кудаив Посмотреть сообщение
ссылку применяй - ссылкуууу
правильно

изменить только прототип и определение функции вот так: (добавить значок & перед v)
C++
1
void Board::print_grid(vector<vector<int> > &v)
и все. а остальное оставить как было
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 22:59  [ТС]     Передача вектора из класса в класс? #12
Вроде все поправил как сказали, а ошибка все-равно присутствует. Простите, я знаю что очень сильно туплю, просто только пришел в с++ и ничего еще не понимаю в нем.

Выдает ошибку:
XML
1
2
3
4
/tmp/ccw37F0g.o: In function `main':
test.cpp:(.text+0x20): undefined reference to `Board::read_grid(int)'
test.cpp:(.text+0x4c): undefined reference to `Board::print_grid(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&)'
collect2: ld returned 1 exit status
file board.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include "board.h"
using namespace std;
 
vector<vector<int> > Board::read_grid(int size)
{
    vector<vector<int> > v(size);
    
    //This code instantiates the vector of vectors
    //All cells are set to false
    for(int i = 0; i < size; ++i)
    {
        vector<int> w(size, 0);
    }
 
 
    ifstream infile("example");
    int x;
    int g = 0;
    int checkLine = 0;
    for (int f = 0; f < size; ++f)
    {
        while ( g < size && infile >> x )
        {
            cout << "This is x: " << x << endl;
        
            if (g < size)
            {
                v.at(f).at(g) = x;
                g += 1;
            }
    
        }
        g = 0;
    }
 
        return v;
}
 
 
void Board::print_grid(vector<vector<int> > &v)
{
    for(unsigned int i = 0; i < v.size(); ++i)
    {
        for(unsigned int j = 0; j < v.at(i).size(); ++j)
        {
            cout << v.at(i).at(j) << " ";
        }
        cout << "\n";
    }
    cout << "\n";
}
file board.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <vector>
#include <iostream>
 
class Board
{
 
 
public: 
    std::vector<std::vector<int> > read_grid(int);  
    void print_grid(std::vector<std::vector<int> > &v);
    std::vector<std::vector<int> > grid;
};
file test.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "board.h"
#include <vector>
#include <iostream>
 
using namespace std;
Board newBoard;
 
int main(void)
{
    int grid_size = 9; 
    newBoard.grid = newBoard.read_grid(grid_size);
        newBoard.print_grid(newBoard.grid);
}
Буду очень благодарен, если поможете

Добавлено через 1 час 39 минут
что, ничкто-никто не может подсказать?
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 23:03     Передача вектора из класса в класс? #13
я не могу найти ошибку(
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 23:15  [ТС]     Передача вектора из класса в класс? #14
В любом случае огромное спасибо, это я налажал, а ты и так пытаешься разобрать что я тут наделал Может для меня будет более правильным решением попробовать это все компайлить через эклипс а не путем g++ в терминале линукса?
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,283
29.09.2013, 07:22     Передача вектора из класса в класс? #15
Цитата Сообщение от broboa Посмотреть сообщение
что, ничкто-никто не может подсказать?
вам в самом начале уже советовали сделать так g++ board.cpp test.cpp -o my_super_program_bin
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
29.09.2013, 11:46     Передача вектора из класса в класс? #16
Цитата Сообщение от DU Посмотреть сообщение
и не слушайте совет на счет написания using namespace std;
Цитата Сообщение от broboa Посмотреть сообщение
#include <vector>
#include <iostream>
class Board
{
public:
std::vector<std::vector<int> > read_grid(int); *
* * void print_grid(std::vector<std::vector<int> > v);
* * std::vector<std::vector<int> > grid;
};
Я не вижу, где здесь может произойти конфликт имен?)
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.09.2013, 12:17     Передача вектора из класса в класс? #17
в конкретно этом файле - нет его.
конфликт может возникнуть при росте проекта при включении этого файла прямо или косвенно в другие места.
вот тогда придется помучится. так что лучше сразу приучится не писать никогда эти юзинги в h файлах. по крайней мере до тех пор, пока не будет четкого понимания к чему это может привести. новичкам такое советовать точно не стоит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 23:08     Передача вектора из класса в класс?
Еще ссылки по теме:

Передача свойства одного экземпляра класса другому экземпляру класса C++
C++ Передача параметра из класса в класс
C++ Передача указателя в класс на объект другого класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
29.09.2013, 23:08  [ТС]     Передача вектора из класса в класс? #18
Большое вам всем спасибо, теперь разобрался!
Yandex
Объявления
29.09.2013, 23:08     Передача вектора из класса в класс?
Ответ Создать тему
Опции темы

Текущее время: 10:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru