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

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

Войти
Регистрация
Восстановить пароль
 
 
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
#1

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

20.02.2013, 19:28. Просмотров 572. Ответов 17
Метки нет (Все метки)

Доброго времени суток!

При использовании функции-члена 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';
    }
}
}
В чём проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2013, 19:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при использовании функции-члена (C++):

Ошибка при использовании дружественной функции - C++
Доброго времени суток! Не могу понять, в строках 17 и 20 пишет, что член hate, объявленный в строке 8 недоступен Подскажите, в чем...

Ошибка при использовании vector в заголовке функции - C++
/home/motoroller/qtProjects/laba1/main.cpp:8: ошибка: 'std::vector' is not a type bool extract_class_head(string str, std::vector...

Ошибка времени выполнения при использовании функции scanf_s - C++
Есть код создания библиотеки книг, это его часть. Если потребуется могу скинуть весь код, но он без комментариев void...

возникает ошибка при использовании массива, как параметр функции - C++
Добрый вечер. Помогите разобраться, пожалуйста. Задача: Проверьте, верно ли, что количество строк матрицы А(n*n), в которой все числа...

Ошибка компиляции при инициализации статического члена в классе - C++
Chat ot const char* class Order : public MenuCategory{ protected: static const char category = '1: Замовити'; public: ...

Ошибка при использовании gets() - C++
Не могу понять, почему при второй итерации цикла программа выдает ошибку и закрывается при запросе фамилии. #include &quot;stdafx.h&quot; ...

17
SummerRain
326 / 325 / 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);
1
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 19:37  [ТС] #3
Отлично, спасибо, SummerRain
0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
20.02.2013, 19:38 #4
del
0
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);
В чём улучшение?
0
SummerRain
326 / 325 / 17
Регистрация: 16.12.2012
Сообщений: 544
20.02.2013, 19:56 #6
у меня компилятор (MSVS 2010) выдаёт
warning C4800: int: принудительно задано логическое значение "true" или "false" (предупреждение о производительности)
ничего страшного в этом нету, можно оставить как есть, но во втором случае мы "пушим" в булевой вектор сразу же булевое значение, а в первом случае нужно int приводить к bool.
Производительность программы будет чуток выше.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 20:01 #7
Цитата Сообщение от Denis. Посмотреть сообщение
В чём улучшение?
В первом случае если 0, то будет false, если 1 - true. Во втором случае наоборот.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
20.02.2013, 20:05 #8
Цитата Сообщение от Denis. Посмотреть сообщение
В чём улучшение?
в том что условие исполняется с точностью до наоборот
1
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 21:15  [ТС] #9
Про "наоборот" понятно

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

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

В первом варианте - проверка, положительно ли число.
Во втором - сравнение и проверка, положительно ли число.
Правда несёрьёзно, простое любопытство
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
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
1
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 23:53  [ТС] #13
Да, точнее ненулевые числа принимаются за true.
Конечно i будет равна 1, ведь производится преобразование обратно к логическому типу
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
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;
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; // наоборот
А вообще я тебя понял.
Кстати, читаю твою тему про Атмегу и ШД, актуально для меня
0
21.02.2013, 00:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 00:22
Привет! Вот еще темы с ответами:

Ошибка при использовании % - C++
(условие задачи, код и ошибки при коомпиляции на скрине) Здравствуйте, задача простая, как и ее решение, на фортране бы уже пять раз...

Ошибка при использовании delete - C++
И снова здравствуйте! Пишу раз третий.Я уже готов убицца ап сцену изза этого delete.Я не понимаю что не так делаю: class CMenu { ...

Ошибка при использовании new[] / delete[] - C++
Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал, тот поймет :) ). Для начала приведу...

Ошибка при использовании reverse_iterator - C++
std::array&lt;int, 7&gt; m = { 1, 2, 3, 4, 5, 6, 7 }; vector&lt;int&gt; v(m.begin(), m.end()); vector&lt;int&gt;::iterator pos = find(v.begin(),...


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

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

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