Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
RareScrap
1 / 1 / 0
Регистрация: 14.10.2013
Сообщений: 87
#1

Не удается обратиться к свойству класса из метода класса - C++

04.01.2015, 06:34. Просмотров 305. Ответов 7
Метки нет (Все метки)

Пишу хедер для работы с файлами такой структуры:

Кликните здесь для просмотра всего текста

nametype1
http://www.cyberforum.ru/cpp-beginners/thread1233666.html
name1
name2
name3
name4

nametype2
name1
name2

nametype3
name1
name2
name3


Сам хедер:

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
#include <string>
#include <cstdlib>                  // Для time()
#include <ctime>                        // Для инициализации srand() параметром time()
#include <fstream>
using namespace std;
 
class HierarchyFile
{
public:
    HierarchyFile(char*);
 
    string returnNameStr()
    {
        return nameStr;
    }
    string returnNametypeStr()
    {
        return nametypeStr;
    }
protected:
    fstream file;
    int strNum;                         // Количество строк в файле
    string nameStr;                     // Текущее имя
    string nametypeStr;                 // Текущая категория
 
    void selectStrNum();
 
    string numderedStr(int);        // Вернуть num по счету строку
    string randomNametype(int, int);    // Вернуть случайную категорию в диапазоне
    string randomName(int, int);        // Вернуть случайное имя в диапазоне
    string nametype();          // Вернуть категорию, в которой содержится nameStr
    string name();              // Венуть случайное имя, которое принадлежит nametypeStr
};
 
void HierarchyFile::selectStrNum()
{
    string str;             // Временная строка
    strNum = 0;
    while (!file.eof())
    {
        getline(file, str);
        strNum++;
    }
    file.seekg(0);
}
 
string HierarchyFile::numderedStr(int number)
{
    string str;             // временная строка
    for (int i = 0; i < number; i++)
        getline(file, str);
    file.seekg(0);
    return str;
}
 
string HierarchyFile::randomNametype(int begin = 0, int end = HierarchyFile::strNum)
{
    string str = "\t";
    for (int rd = rand()%(end - begin + 1); str[0] == '\t';)
        str = numderedStr(rd);
    return str;
}
Компилятор выдает

Кликните здесь для просмотра всего текста

HierarchyFile.h:22:6: error: invalid use of non-static data member 'HierarchyFile::strNum'
int strNum; //
^
HierarchyFile.h:62:78: error: from this location
string HierarchyFile::randomNametype(int begin = 0, int end = HierarchyFile::strNum)
^
Сборка завершилась с ошибкой.


Но ведь метод может обращаться к свойства класса. Почему возникает ошибка? Есть в стандартной библиотеке класс для работы с такими файлами?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2015, 06:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не удается обратиться к свойству класса из метода класса (C++):

Как обратиться к компоненте формы из метода класса?
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^...

Не удается запустить указатель метода по указателю класса
Первый класс - бесцветная (белая) линия, Второй класс - цветная линия. Если...

Классы: как из статического метода обратиться к статической переменной класса
Классы: как из статического метода обратиться к статической переменной класса

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

Может ли метод родительского класса обратиться к полю дочернего класса
Может ли метод родительского класса обратиться к полю дочернего класса?

7
hoggy
Заблокирован
04.01.2015, 06:39 #2
C++
1
string HierarchyFile::randomNametype(int begin = 0, int end = HierarchyFile::strNum)
Попытка использовать в качестве значения по умолчанию содержимое переменной strNum

это равносильно тому, как если бы вы просто в любом месте записали:

C++
1
int end = HierarchyFile::strNum
У разных экземпляров класса могут быть разные значения этой переменной.
Вы же не указываете экземпляр из которого нужно взять значение. Вы пытаетесь заполучить его у класса "как бы без экземпляра".
0
RareScrap
1 / 1 / 0
Регистрация: 14.10.2013
Сообщений: 87
04.01.2015, 07:01  [ТС] #3
Можно ли установить значение по умолчанию, не создавай функцию, которая возвращает strNum?
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
04.01.2015, 07:18 #4
я бы сделал так ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Object
{
private:
    int x = 0;
public: 
    void setX(int r)
    {
        x = r;
    }
    void f()
    {
        f(0, x);
    }   
    void f(int t, int r)
    {
        cout << "ky-ky";
    }
};
0
RareScrap
1 / 1 / 0
Регистрация: 14.10.2013
Сообщений: 87
04.01.2015, 10:03  [ТС] #5
Мне нужно дать аргументу метода значение по умолчанию без создания экземпляра класса. И желательно не выносить аргументы в свойства класса.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2015, 13:07 #6
Цитата Сообщение от RareScrap Посмотреть сообщение
Мне нужно дать аргументу метода значение по умолчанию без создания экземпляра класса
rikimaru2013, привет вариант с перегрузкой функции. В твоем случае можно сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
string HierarchyFile::randomNametype_impl(int begin, int end) // private реализация
{
    string str = "\t";
    for (int rd = rand()%(end - begin + 1); str[0] == '\t';)
        str = numderedStr(rd);
    return str;
}
 
string HierarchyFile::randomNametype() // без параметров
{
   return randomNametype_impl(0, strNum);
}
 
string HierarchyFile::randomNametype(int begin) // 1 параметр
{
   return randomNametype_impl(begin, strNum);
}
 
string HierarchyFile::randomNametype(int begin, int end) // 2 параметра
{
   return randomNametype_impl(begin, end);
}
Ну и от using namespace std; хорошо бы отказаться (хотя бы из-за наличия std::begin/std::end), особенно в заголовочном файле.
0
rikimaru2013
04.01.2015, 19:41
  #7

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
привет
ага привет) а чего меня выделять а не автора?) просто так зашёл посмотреть ))) Или мой псевдокод не помог бы ТСу без прямой лопатной работы его кода и вывалить 100% готового кода )))

0
Tulosba
04.01.2015, 21:09     Не удается обратиться к свойству класса из метода класса
  #8

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ага привет)
должно было быть "привел" и без запятой, которая автоматом вставляется.

0
04.01.2015, 21:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2015, 21:09
Привет! Вот еще темы с ответами:

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать...

Ошибка при вызове метода класса в методе другого класса
Господа программисты, возникла такая проблема. При вызове метода класса в...

Вызов метода класса из метода другого класса
Помогите школнегу Имеется несколько классов class Com { protected:...

Вызов метода внутреннего класса методом внешнего класса
Не могу разобраться как реализовать вложенный класс и как его вызвать....


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

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

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