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

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

Войти
Регистрация
Восстановить пароль
 
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
#1

Как определять какой метод должен быть статическим, а какой нет? - C++

01.08.2012, 16:55. Просмотров 857. Ответов 8
Метки нет (Все метки)

Quer::add_line_to_vec: недопустимый вызов нестатической функции-члена
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2012, 16:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как определять какой метод должен быть статическим, а какой нет? (C++):

Какой тип должен быть у функции? - C++
Сделал ф-цию, которая считывает файла и записывает результат работы с данными в vector. решил проверить, что хранит векотор, сделал ф-цию...

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

Какой должен быть прототип у оператора копирующего присваивания? - C++
Какой должен быть прототип у оператора копирующего присваивания?

Какой должен быть итератор для константной ссылки на вектор? - C++
Есть вектор, он передается в функцию так: #include <iostream> #include <vector> using namespace std; void func(vector<int> arg)...

Какой должен быть синтаксис для использования вложенного шаблонного класса? - C++
Никак не могу найти, как это правильно написать? template <class T> class List { private: template <T> class Node { T...

В VC++ параметр const (_variant_t & data) непонятно какой должен быть - C++
Господа помогите кто чем может :-) ITablePtr pTable есть ф-я pTable->SetPrivateData(long dataTag,const _variant_t & data) с первым...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
01.08.2012, 17:03 #2
Ну если он использует переменные конкретного объекта и ассоциируется именно с этим объектом, то нестатический, в противном случае статический (т.е. не относиться к конкретному объекту класса, но относится к классу)
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
01.08.2012, 17:06  [ТС] #3
можно на коротеньком примере ?

вот мой класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Quer {
public:
    typedef std::vector<std::string>::size_type siz_vec;     // тип хранящий размер вектора
 
    // МЕТОДЫ
    void add_line_to_vec(std::ifstream&);
    
 
private:
    std::map<std::string, std::set<int> > word_map;     // карта хранящая слово(ключ) и номера строк в которых оно встречается(набор)
    std::vector<std::string> line_text;                 // вектор хранящий каждую строку текста
};

вот программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main() 
{
    std::string file_name_str;
    std::ifstream file_f;
    std::cout << "Enter file name and its type(name.type)" << std::endl
            << " -> ";
    std::cin >> file_name_str;
    open_file(file_f, file_name_str);
    Quer::add_line_to_vec(file_f);
 
    return 0;
}

определение функций
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
void open_file(std::ifstream& f, std::string ss)
{ 
    if (std::ifstream(ss.c_str()) == NULL) {
        system("cls");
        std::cout << "Error file not found!" << std::endl
            << "Enter file name and its type(name.type)" << std::endl
            << " -> ";
        std::string if_error;
        std::cin >> if_error;
        open_file(f, if_error);
    } else {
        f.open(ss.c_str());
        std::cout << "Excellent! The file is opened" << std::endl;
    }
}
 
//Заполняем вектор строками из открытого файла
void Quer::add_line_to_vec (std::ifstream& f) 
{
    std::string line;
    while (std::getline(f, line)) {
        line_text.push_back(line);
    }       
}
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
01.08.2012, 17:22 #4
Насчет примера пока что ничего придумать путного не могу.
Но по коду можно сказать следующее:
C++
1
Quer::add_line_to_vec(file_f);
Нестатическая функция относиться к конкретному объекту, поэтому вызывается у этого объекта
т.е.
C++
1
2
Quer a;
a.add_line_to_vec(file_f);
или
C++
1
2
Quer a;
a->add_line_to_vec(file_f);
А в данном случае функция у тебя к объекту не привязана.
В данном случае функция у тебя должна быть нестатическая, т.к. добавляет строку текста в конкретный объект класса.
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
01.08.2012, 17:25  [ТС] #5
все понял, спасибо
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
01.08.2012, 17:45 #6
Цитата Сообщение от DaskOFF Посмотреть сообщение
можно на коротеньком примере ?
как пример посмотри паттерн Singleton
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
01.08.2012, 18:11 #7
C++
1
2
3
4
5
6
7
8
9
10
class Quer {
public:
    typedef std::vector<std::string>::size_type siz_vec;  
 
    static void add_line_to_vec(std::ifstream&);
    
private:
    static std::map<std::string, std::set<int> > word_map;   
    static std::vector<std::string> line_text;              
};
Статические ф-ции работаю со статическими членами класса.

Как вариант передавать статической ф-ции конкретный объект:
C++
1
2
Quer Obj;
Quer::add_line_to_vec(file_f,Obj);
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2012, 18:14 #8
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
class Quer {
public:
    typedef std::vector<std::string>::size_type siz_vec;  
 
    static void add_line_to_vec(std::ifstream&);
    
private:
    static std::map<std::string, std::set<int> > word_map;   
    static std::vector<std::string> line_text;              
};
Статические ф-ции работаю со статическими членами класса.
Как вариант передавать статической ф-ции конкретный объект.
не забыть бы еще где-нибудь создать эти статические члены класса, а то линкер заругается
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
01.08.2012, 18:15 #9
не забыть бы еще где-нибудь создать эти статические члены класса, а то линкер заругается
Само собой...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2012, 18:15
Привет! Вот еще темы с ответами:

В VC++ параметр const (_variant_t & data) непонятно какой должен быть - C++
Здарствуйте господа Я создаю репорт с помощью 'Report Designer Component' IApplicationPtr pApp; IReportPtr pRep; IReportPtr...

Как правильно должен быть написан метод возвращающий ссылку на вектор - C++
Доброе время форумчане! Ну собственно сама тема говорит Есть класс class SoftwareCore { private: public:

Придумать формулу/алгоритм, который будет определять в какой из пяти корзин расположен шарик - C++
Доброго времени суток. Помогите придумать формулу/алгоритм, который будет определять в какой из пяти корзин расположен шарик. Шарики...

Создать программу, которая будет определять с какой буквы вы ввели слово с А, с Б или с В и выводить об этом сообщение - C++
Ребят, нужна помощь. С++ Создать программу, которая будет определять с какой буквы вы ввели слово с А, с Б или с В и выводить об этом...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2012, 18:15
Ответ Создать тему
Опции темы

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