Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
1

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

28.09.2013, 18:33. Просмотров 859. Ответов 17
Метки нет (Все метки)

Доброго времени суток! У меня возникла проблема в очень простой программе. Я передаю функции из класса 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);
}
простите за гору кода, просто правда уже полдня пытаюсь найти ошибку. Спасибо вам огромное заранее за помощь!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2013, 18:33
Ответы с готовыми решениями:

Передача вектора структур из класса в другой класс
Здравствуйте форумчане, собсно есть два класса в первом создаётся и заполняется вектор...

Класс итератора для класса вектора
Необходимо реализовать собственный класс итератора для прохода по вектору, с перегрузкой оператора...

Написать функцию для класса, возращающую данный из вектора обьектов класса по итератору вектора
День=добрый как написать функцию для класса возращающую данный из вектора обьектов класса по...

Передача параметра из класса в класс
Добрый вечер. Я передаю цвет квадратика(класс square) в функция стирания треугольника(класс...

Передача переменной из класса А в класс Б
Добрый день. По какой-то причине не получается получить переменную из другого класса. class A...

17
monolit
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 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, как альтернатива.
0
DU
1489 / 1135 / 165
Регистрация: 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. это плохой совет,
так делать не стоит.
1
vxg
Модератор
3299 / 2093 / 330
Регистрация: 13.01.2012
Сообщений: 8,133
28.09.2013, 19:20 4
а вы cpp файл к проекту добавили?
0
28.09.2013, 19:20
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 19:20  [ТС] 5
спасибо большое за помощь, сейчас попробую и отпишусь. Насчет метода main, это я его откомментить забыл, прошу прощение
0
User409368
192 / 169 / 32
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 19:24 6
Цитата Сообщение от broboa Посмотреть сообщение
C++
1
void Board::print_grid(vector<vector<int> > v)
зачем весь вектор передавать в функцию которая просто печатает его содержимое? ведь можно передать ссылку или указатель. и не будет лишнего копирования и сама программа будет быстрее работать
1
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 19:33  [ТС] 7
Цитата Сообщение от _ Посмотреть сообщение
зачем весь вектор передавать в функцию которая просто печатает его содержимое? ведь можно передать ссылку или указатель. и не будет лишнего копирования и сама программа будет быстрее работать
не могли бы показать на примере как сослать вектор?

Добавлено через 1 минуту
Цитата Сообщение от DU Посмотреть сообщение
похоже вы собираете только один файл test.cpp.
компилятор увидел объявление класса и все что нужно сделал. а вот линкер - нет.
линкеру нужно сказать, чтобы он компоновал программу из двух объектных файлов:
test.cpp и board.cpp.
так делать не стоит.
Не очень понимаю как это все реализовать. Да и вообще не понимаю что вы имеете ввиду? можно с примером пожалуйста? Все остальное поправил! Спасибо
0
User409368
192 / 169 / 32
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 19:37 8
Цитата Сообщение от broboa Посмотреть сообщение
не могли бы показать на примере как сослать вектор?
просто звездочку поставить перед v
C++
1
void Board::print_grid(vector<vector<int> > *v)
теперь эта функция принимает указатель
0
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, мне там тоже надо звездочку поставить? или где-то еще?
0
Кудаив
413 / 412 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
28.09.2013, 19:52 10
Цитата Сообщение от _ Посмотреть сообщение
теперь эта функция принимает указатель
ссылку применяй - ссылкуууу
1
User409368
192 / 169 / 32
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 19:55 11
Цитата Сообщение от Кудаив Посмотреть сообщение
ссылку применяй - ссылкуууу
правильно

изменить только прототип и определение функции вот так: (добавить значок & перед v)
C++
1
void Board::print_grid(vector<vector<int> > &v)
и все. а остальное оставить как было
2
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 минут
что, ничкто-никто не может подсказать?
0
User409368
192 / 169 / 32
Регистрация: 09.09.2013
Сообщений: 524
28.09.2013, 23:03 13
я не могу найти ошибку(
0
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 23:15  [ТС] 14
В любом случае огромное спасибо, это я налажал, а ты и так пытаешься разобрать что я тут наделал Может для меня будет более правильным решением попробовать это все компайлить через эклипс а не путем g++ в терминале линукса?
0
vxg
Модератор
3299 / 2093 / 330
Регистрация: 13.01.2012
Сообщений: 8,133
29.09.2013, 07:22 15
Цитата Сообщение от broboa Посмотреть сообщение
что, ничкто-никто не может подсказать?
вам в самом начале уже советовали сделать так g++ board.cpp test.cpp -o my_super_program_bin
1
monolit
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 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;
};
Я не вижу, где здесь может произойти конфликт имен?)
0
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
29.09.2013, 12:17 17
в конкретно этом файле - нет его.
конфликт может возникнуть при росте проекта при включении этого файла прямо или косвенно в другие места.
вот тогда придется помучится. так что лучше сразу приучится не писать никогда эти юзинги в h файлах. по крайней мере до тех пор, пока не будет четкого понимания к чему это может привести. новичкам такое советовать точно не стоит.
1
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
29.09.2013, 23:08  [ТС] 18
Большое вам всем спасибо, теперь разобрался!
0
29.09.2013, 23:08
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 23:08

Передача информации из класса в класс
Хочу написать программу разделённую на классы, может кто подсказать как сделать чтобы классы имели...

Передача указателя функции класса A в класс B
Добрый день! Стоит задача вызывать функцию другого класса в потоке, ну что то типа этого: ...

Передача указателя в класс на объект другого класса
Не могу передать ссылку на объект класса в другой класс main.cpp #include &lt;iostream&gt;...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.