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

Ошибка при использовании функции-члена - C++

Восстановить пароль Регистрация
 
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 19:28     Ошибка при использовании функции-члена #1
Доброго времени суток!

При использовании функции-члена print() с объектом класса bin_image , созданом конструктором по умолчанию возникает ошибка:
cpp.cpp:31:5: ошибка: запрос элемента «print» в «b2», имеющего не классовый тип «bin_image()»
Однако, если использовать эту функцию с объектом, созданном конструктором со значением, всё проходит гладко.

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
75
76
77
78
/*
 
 
 
*/
 
#include <iostream>
#include <vector>
#include <cstdlib>
 
class bin_image
{
    public:
        bin_image (int h, int w);   
        bin_image ();
        void print();
        
    private:
        int high;
        int width;
        std::vector< std::vector<bool> > v;
};
 
// main is here <-----------------
int main()
{
    bin_image b1(10, 10);
    bin_image b2();
    
    b1.print(); // Нет проблем
    b2.print(); // Возникает ошибка
    
    return 0;
}
 
// 1st bin_image constructor
bin_image::bin_image (int h, int w)
    :high(h), width(w)
{
//  if(h<0 || w<0)
//      error("vector parametre(s) is negative");
// vec initialization...
    for(int c=0; c<width; c++)
    {
        std::vector<bool> vv;
        v.push_back(vv);
        for(int cc=0; cc<high; cc++)
        {
            v[c].push_back(rand()%2);
        }
    }
}
 
// 2nd bin_image constructor (constructor by default)
bin_image::bin_image ()
    :high(0), width(0)
{   
    std::vector<bool> vv;
        v.push_back(vv);
}
 
// bin_image print funcrion
void bin_image::print()
{
    int wi = width;
    int hi = high;
 
    if(v.size() > 0)
        hi = v[0].size();
 
    for(int c=0; c<hi; c++)
    {
        for(int cc=0; cc<wi; cc++)
            std::cout << v[cc][c] << ' ';
        std::cout << '\n';
    }
}
}
В чём проблема?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
20.02.2013, 19:35     Ошибка при использовании функции-члена #2
строка 28
C++
1
bin_image b2();
нужно заменить на
C++
1
bin_image b2;
Добавлено через 1 минуту
ещё возможно лучше сделать вместо
C++
1
 v[c].push_back(rand()%2);
C++
1
 v[c].push_back(rand()%2 == 0);
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 19:37  [ТС]     Ошибка при использовании функции-члена #3
Отлично, спасибо, SummerRain
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
20.02.2013, 19:38     Ошибка при использовании функции-члена #4
del
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 19:40  [ТС]     Ошибка при использовании функции-члена #5
Добавлено через 53 секунды
Добавлено через 1 минуту
ещё возможно лучше сделать вместо
C++
1
 v[c].push_back(rand()%2);
C++
1
 v[c].push_back(rand()%2 == 0);
В чём улучшение?
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
20.02.2013, 19:56     Ошибка при использовании функции-члена #6
у меня компилятор (MSVS 2010) выдаёт
warning C4800: int: принудительно задано логическое значение "true" или "false" (предупреждение о производительности)
ничего страшного в этом нету, можно оставить как есть, но во втором случае мы "пушим" в булевой вектор сразу же булевое значение, а в первом случае нужно int приводить к bool.
Производительность программы будет чуток выше.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 20:01     Ошибка при использовании функции-члена #7
Цитата Сообщение от Denis. Посмотреть сообщение
В чём улучшение?
В первом случае если 0, то будет false, если 1 - true. Во втором случае наоборот.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
20.02.2013, 20:05     Ошибка при использовании функции-члена #8
Цитата Сообщение от Denis. Посмотреть сообщение
В чём улучшение?
в том что условие исполняется с точностью до наоборот
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 21:15  [ТС]     Ошибка при использовании функции-члена #9
Про "наоборот" понятно

Я считал что дополнительная операция (операция сравннения) ещё больше загрузит процессор, но,
Цитата Сообщение от SummerRain Посмотреть сообщение
во втором случае мы "пушим" в булевой вектор сразу же булевое значение, а в первом случае нужно int приводить к bool.
Производительность программы будет чуток выше.
убедило меня в обратном.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 21:40     Ошибка при использовании функции-члена #10
Это всё несерьёзно. Теоретические рассуждения. Я бы не стал утверждать, что приведение типа int к bool(а может он вообще не приводится?) занимает больше времени, чем операция сравнения. И о какой загрузке процессора идёт речь? На один такт больше?
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 22:18  [ТС]     Ошибка при использовании функции-члена #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Это всё несерьёзно. Теоретические рассуждения. Я бы не стал утверждать, что приведение типа int к bool(а может он вообще не приводится?) занимает больше времени, чем операция сравнения. И о какой загрузке процессора идёт речь? На один такт больше?
Несомненно, один такт - это копеечная загрузка, но всё-таки какой-то из вариантов может выполнятся быстрее на мизер Это смешно, но просто из любопытсва - каким образом можно узнать скорость выполнения? Обработать огромное количество данных и сравнить скорости двух вариантов, так?

По поводу приведения типа - rand() возвращает int, а bool принимает любое положительное число за true (т.е. определяет, положительное ли число). Значит, преобразование int к bool должно производится.

В первом варианте - проверка, положительно ли число.
Во втором - сравнение и проверка, положительно ли число.
Правда несёрьёзно, простое любопытство
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
20.02.2013, 23:11     Ошибка при использовании функции-члена #12
Цитата Сообщение от Denis. Посмотреть сообщение
bool принимает любое положительное число за true
Это BOOL и не положительное а любое отличное от нуля
а bool это 0 или 1
попробуй
C++
1
2
3
4
5
bool b=false;
b++;
b++;
b++;
int i=b;
i будет равна 1
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 23:53  [ТС]     Ошибка при использовании функции-члена #13
Да, точнее ненулевые числа принимаются за true.
Конечно i будет равна 1, ведь производится преобразование обратно к логическому типу
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
21.02.2013, 00:01     Ошибка при использовании функции-члена #14
Цитата Сообщение от Denis. Посмотреть сообщение
Конечно i будет равна 1, ведь производится преобразование обратно к логическому типу
опять с точностью до наоборот
логический преобразуется в целочисленный
из bool в int а не наоборот

кстати если напишешь так
C++
1
2
3
4
5
int i=0;
i++;
i++;
i++;
bool b=i;
выскочит варнинг что то типа возможна потеря значений
правильно писать так
C++
1
bool b=i!=0;
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
21.02.2013, 00:22  [ТС]     Ошибка при использовании функции-члена #15
Имел ввиду что bool преобразовывает отличное от нуля в логический.
Т.е.
C++
1
2
bool b = 2; // из численного в логический
int i = b; // наоборот
А вообще я тебя понял.
Кстати, читаю твою тему про Атмегу и ШД, актуально для меня
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
21.02.2013, 00:37     Ошибка при использовании функции-члена #16
Цитата Сообщение от Denis. Посмотреть сообщение
Имел ввиду что bool преобразовывает отличное от нуля в логический.
в последних стандартах С появился тип bool который имеет два значения true( истина) или false(ложь)
не надо их привязывать к нулю или не нулю
да сейчас это соответствует истине 0 false все остальное true, но могут ведь и поменять( хотя вряд ли куча программ рухнет)
но все равно оперируй этими значениями
C++
1
bool b=i;
это преобразование типа как внутри сделает компилятор не известно
а это
C++
1
bool b=i!=0;
уже присвоение
проверятся i не равно нулю если да записывается true если нет( i равно нулю) false

Не по теме:

Цитата Сообщение от Denis. Посмотреть сообщение
Кстати, читаю твою тему про Атмегу и ШД, актуально для меня
и что вычитал



Добавлено через 45 секунд
Цитата Сообщение от Denis. Посмотреть сообщение
bool b = 2; // из численного в логический
нормальный компилятор должен дать ошибку или варнинг
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
21.02.2013, 01:17  [ТС]     Ошибка при использовании функции-члена #17
Цитата Сообщение от ValeryS Посмотреть сообщение
Цитата Сообщение от Denis. Посмотреть сообщение
bool b = 2; // из численного в логический
нормальный компилятор должен дать ошибку или варнинг
Почему? Потому что это неявное преобразование?
Такая инициализация поддерживается и используется. Хотя, может я читаю старый стандарт

Не по теме:


Ты используешь управление в микрошаговом режиме и ЦАП, это сложнее и интереснее.
Т.к. положение ротора в микрошаге не определено, да и момент уменьшается (у меня очень маломощные двигатели, от флоппи) я использую обычное полношаговое позиционирование в своём проекте и Н-мосты на транзисторах, это достаточно просто и надёжно. А уменьшение угла поворота буду производить с помощью редуктора. В микрошаг, насколько мне известно, уходят для избавления от резонанса (ведь частота колебаний двигателя там значительно меньше). Ещё один существенный плюс в полношаговом режиме - лёгкое программирование.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 01:21     Ошибка при использовании функции-члена
Еще ссылки по теме:

C++ Ошибка при использовании vector в заголовке функции
C++ Ошибка при использовании %
C++ Ошибка при использовании reverse_iterator

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

Или воспользуйтесь поиском по форуму:
ValeryS
21.02.2013, 01:21     Ошибка при использовании функции-члена
  #18

Не по теме:

Цитата Сообщение от Denis. Посмотреть сообщение
Ещё один существенный плюс в полношаговом режиме - лёгкое программирование.
давай с этим в ту тему

Yandex
Объявления
21.02.2013, 01:21     Ошибка при использовании функции-члена
Ответ Создать тему
Опции темы

Текущее время: 02:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru