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

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

Войти
Регистрация
Восстановить пароль
 
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 154
#1

Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++) - C++

23.11.2014, 17:25. Просмотров 267. Ответов 2
Метки нет (Все метки)

Всем привет.

Пытаюсь написать свой первый демон на C++ по образу и подобию сделанного на PHP.

Столкнулся со следующей проблемой.

В PHP у меня был универсальный класс, методы которого принимали массивы параметров запроса к mysql (поля, таблицы и т.д.), после чего выполняли операции над базой данных по этим параметрам.

Пытаюсь сейчас воспроизвести это в с++.

Вроде всё уже осилил, но осталась одна проблема - мне никак не удаётся передать обратно в функцию main получившийся после select массив.

На различных форумах вообще советуют не передавать массивы между функциями.
Посоветуйте с какой стороны лучше подойти и как реализовать данную задачу.

Сейчас код следующий

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
/* 
 * File:   query_class.h
 * Author: fedoseev
 *
 * Created on 22 Ноябрь 2014 г., 18:11
 */
 
#ifndef QUERY_CLASS_H
#define QUERY_CLASS_H
 
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
 
#include <mysql/mysql_connection.h>
 
#include <mysql/cppconn/driver.h>
#include <mysql/cppconn/exception.h>
#include <mysql/cppconn/resultset.h>
#include <mysql/cppconn/statement.h>
#include <string>
 
using namespace std;
 
class query_class {
public:
    query_class();
    int i;
    int j;
    typedef string arr_string[1000][1000]; 
    arr_string     select()                    ;
    int     num_arr_dict                ;
    int     num_arr_field               ;
    string *addr_arr_dict = new string[num_arr_dict];
    string *addr_arr_field = new string[num_arr_field];    
 
private:
    
 
    
};
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
65
66
67
68
69
70
71
72
73
74
/* 
 * File:   query_class.cpp
 * Author: fedoseev
 * 
 * Created on 22 Ноябрь 2014 г., 18:11
 */
 
#include "query_class.h"
 
using namespace std;
 
query_class::query_class() 
{
    
}
 
query_class::arr_string query_class::select()
{    
 
    sql::Driver     *driver ;
    sql::Connection *con    ;
    sql::Statement  *stmt   ;
    sql::ResultSet  *res    ;
    query_class     q       ;
    string          field = ""  ;
    string          dict  = ""  ;
    string          select= "select";
    string          from  = "from";
    string          query = ""  ;      
    /* Создание соединения */
    driver = get_driver_instance();
    con = driver->connect("tcp://192.168.0.98:3306", "developer", "yfc#O7tt");
    
    /* Подключение к базе данных mysql */
    con->setSchema("scada");
    
    /* Создание строки со списком полей для запроса */
    int num_field = sizeof(q.addr_arr_field)/sizeof(string);
    for (int i=0; i<(num_field); i++)
    {
        if (field == "") {field = q.addr_arr_field[i];}
        if (field != "") {field += q.addr_arr_field[i];}
        
        
    }
    
        for (int i=0; i<sizeof(q.addr_arr_dict); i++)
    {
        if (dict == "") {dict = q.addr_arr_dict[i];}
        if (dict != "") {dict += q.addr_arr_dict[i];}
    }
    
    query = select + field + from + dict;
    stmt = con->createStatement();
    res = stmt->executeQuery(query);
    int num_res = (sizeof res)/sizeof(string);//получение длины массива делением длины массива в байтах на размер памяти, выделяемой для переменной данного типа
    string addr_arr_result[num_field][num_res] ; 
    int j = 0;
    while (res->next())
    {
        for (int i=0; i<num_field; i++)
            {
              addr_arr_result[j][i] = res->getInt(q.addr_arr_field[i]);
              j++;
            }
    }
 
    delete res;
    delete stmt;
    delete con;
 
 
return addr_arr_result;
}
Добавлено через 2 часа 54 минуты
Возможно я не отразил суть вопроса.

Массив, который необходимо возвратить формируется внутри метода.
В зависимости от результатов запроса его размер разный, а значит определить тип возвращаемого значения функции трудно. Не знаю как к этому подступиться.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2014, 17:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++) (C++):

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

Указатель на метод класса в качестве аргумента метода класса - C++
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

Передача члена класса в качестве параметра метода - C++
Добрый день. Интересует следующий вопрос: как передать член класса как параметр по значению в метод того же класса? То есть необходимо,...

двумерный массив в качестве параметра метода класса - C++
Добрый день Есть проблемка, попробую упростить условия по максимуму: В программе меется некоторый класс, у этого класса есть метод,...

Передача enum в качестве аргумента метода класса - C++
Есть класс //class order; class ticket{ enum type_of_place { coupe, general, berth, wagon_lit }_type_of_place; char*...

Указатель на объект в качестве параметра вызываемого метода класса - C++
Код по сути //Interface.cpp #include &quot;Interface.h&quot; void Interface::input() { Teplitsa *kaka; kaka = new Teplitsa; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
23.11.2014, 18:52 #2
Kapitan79,
Этот ужас нужно убрать:
C++
1
2
3
4
    int     num_arr_dict                ;
    int     num_arr_field               ;
    string *addr_arr_dict = new string[num_arr_dict];
    string *addr_arr_field = new string[num_arr_field];
Как ты думаешь, каков будет размер массива выделенного здесь?

Цитата Сообщение от Kapitan79 Посмотреть сообщение
C++
1
sizeof(q.addr_arr_dict);
Этот код получается размер указателя, а не массива.

Цитата Сообщение от Kapitan79 Посмотреть сообщение
C++
1
sizeof res
Это опять же размер указателя res.

Цитата Сообщение от Kapitan79 Посмотреть сообщение
Массив, который необходимо возвратить формируется внутри метода.
В С++ массивы нельзя возвращать по значению.
Используй std::vector.
1
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 154
23.11.2014, 20:17  [ТС] #3
Спасибо!
Похоже вектор -то что мне было нужно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2014, 20:17
Привет! Вот еще темы с ответами:

Передача метода класса в качестве аргумента внешней функции - C++
Столкнулся со следующей проблемой. Пусть у меня есть некая внешняя функция, которая принимает в качестве аргумента указатель на функцию...

[C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() - C++
Пишу программу для обхода бинаронго дерева поиска. Программа написана и кажется даже работает, но только в консоли. Решил выводить...

#include <exception> (kubuntu, NetBeans, g++) - C++
Всем привет. При подключении инклюдов #include &lt;mysql/mysql_connection.h&gt; #include &lt;boost/property_tree/json_parser.hpp&gt; ...

Странности с неразрешёнными файлами include (Kubuntu, NetBeans) - C++
Всем привет. Буквально несколько дней назад я начал осваивать C++. Мне захотелось попробовать из готовых примеров создать демон,...


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

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

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