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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
#1

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

28.09.2013, 18:33. Просмотров 691. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2013, 18:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача вектора из класса в класс? (C++):

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

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

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

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

Передача указателя функции класса A в класс B - C++
Добрый день! Стоит задача вызывать функцию другого класса в потоке, ну что то типа этого: typedef void (t1::*PTR_FUN)(int);...

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

17
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 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
1483 / 1129 / 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. это плохой совет,
так делать не стоит.
1
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,606
28.09.2013, 19:20 #4
а вы cpp файл к проекту добавили?
0
broboa
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
28.09.2013, 19:20  [ТС] #5
спасибо большое за помощь, сейчас попробую и отпишусь. Насчет метода main, это я его откомментить забыл, прошу прощение
0
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)
зачем весь вектор передавать в функцию которая просто печатает его содержимое? ведь можно передать ссылку или указатель. и не будет лишнего копирования и сама программа будет быстрее работать
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
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)
теперь эта функция принимает указатель
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
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
28.09.2013, 19:52 #10
Цитата Сообщение от _ Посмотреть сообщение
теперь эта функция принимает указатель
ссылку применяй - ссылкуууу
1
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)
и все. а остальное оставить как было
1
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
191 / 168 / 6
Регистрация: 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
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,606
29.09.2013, 07:22 #15
Цитата Сообщение от broboa Посмотреть сообщение
что, ничкто-никто не может подсказать?
вам в самом начале уже советовали сделать так g++ board.cpp test.cpp -o my_super_program_bin
1
29.09.2013, 07:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 07:22
Привет! Вот еще темы с ответами:

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Заполнение вектора класса внутри самого класса - C++
class A { private: int a; public: A() { a = 0; }; A get(vector &lt;A&gt;* vec)

Передача свойства одного экземпляра класса другому экземпляру класса - C++
#include &lt;tchar.h&gt; class A { public: A(); int aVar; }; class B : public A

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса) - C++
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int xSize = 1; const int ySize = 1; class...


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

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

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