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

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

Войти
Регистрация
Восстановить пароль
 
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
#1

Error C2040 в пользовательском классе - C++

08.07.2014, 21:25. Просмотров 336. Ответов 7
Метки нет (Все метки)

Функция main:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
int main( void ) {
    const char str[] = "message";
    String( str );
 
    std::cin.get(); std::cin.get();
    return 0;
}


Ошибка в строке:
C++
1
String( str );
Текст ошибки: "error C2040: str: "String" отличается по уровням косвенного обращения от "const char [8]"Э

Определение функции в классе:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
String::String( const char * str ) {
    debug( "String::String( const char * str )", false );
    length = strlen( str );
    if ( length == 0 ) {
        length = 0;
    } else {
        takeMemory( NULL, length );
        memcpy( data, str, length );
    }
    debug( "String::String( const char * str )", true );
}


И, если понадобятся, функции debug и takeMemory:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//service functions
//  service function takeMemory for reallocate memory for string and check data != 0
void String::takeMemory( char * ptrmem, int size ) {
    debug( "void String::takeMemory( char * ptrmem, int size )", false );
    assert( size >= 0 );
    data = ( char * ) realloc ( ptrmem, sizeof(char)*size );
    assert( data != 0 );
    debug( "void String::takeMemory( char * ptrmem, int size )", true );
}
// service function debug to show location
void String::debug( const char * message, bool exit ) const {
    if ( DEBUG ) {
        std::cout << std::endl;
        if ( exit ) std::cout << "Exiting \"";
        else std::cout << "Entry into \"";
        std::cout << message <<"\".";
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2014, 21:25     Error C2040 в пользовательском классе
Посмотрите здесь:

C++ error C2040: key: "int [256]" отличается по уровням косвенного обращения от "std::ofstream"
Массив в классе. Ошибка error: invalid use of non-static data member C++
C++ C2446 и C2040 ошибки
C++ Выдает ошибку c:\proect\8\8\8.cpp(60): error C2040: ==: "char [20]" отличается по уровням косвенного обращения от "int"
C++ Корректно ли будет работать функция realloc в пользовательском классе массива
В классе инициализировать массив, в классе создать функцию вывода массива на экран C++
Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
08.07.2014, 21:29     Error C2040 в пользовательском классе #2
а так

C++
1
char* str = "message";
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
08.07.2014, 21:32  [ТС]     Error C2040 в пользовательском классе #3
Я тоже так сначала попытался, сделать (даже понимая что массив - указатель на его первый элемент ), но получил такую ошибку:
error C2040: str: "String" отличается по уровням косвенного обращения от "char *"
Почти то же...
ValeryS
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
08.07.2014, 21:54     Error C2040 в пользовательском классе #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от satisfactor Посмотреть сообщение
(даже понимая что массив - указатель на его первый элемент )
не совсем
при такой записи
C++
1
char str[] = "message";
в стеке создается массив и инициализируется строкой "message"
при такой записи
C++
1
char* str = "message";
str указатель на строку(массив) который лежит в неизменяемой памяти, так скажем вшит в текст программы компилятором

при такой записи
C++
1
const char str[] = "message";
не знаю как поведет себя компилятор
попробуй еще так
C++
1
String("message" );
я пытаюсь локализировать ошибку

может в
C++
1
String::String( const char * str )
const стоит не там

здесь он, если не ошибаюсь, говорит неизменяемый указатель

а может нужно так
C++
1
String::String( char *  const str )
указатель на неизменяемую строку
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
08.07.2014, 22:02  [ТС]     Error C2040 в пользовательском классе #5
Это запустилось.
C++
1
String( "message" );
Убежденный
Системный программист
 Аватар для Убежденный
14662 / 6608 / 1046
Регистрация: 02.05.2013
Сообщений: 10,885
Завершенные тесты: 1
08.07.2014, 22:19     Error C2040 в пользовательском классе #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от satisfactor Посмотреть сообщение
String( str );
То же самое, что
C++
1
String str;
А str уже объявлен, поэтому ошибка.
Надо так:
C++
1
String s(str);
Цитата Сообщение от ValeryS Посмотреть сообщение
может в
C++
1
String::String( const char * str )
const стоит не там
здесь он, если не ошибаюсь, говорит неизменяемый указатель
а может нужно так
C++
1
String::String( char * const str )
указатель на неизменяемую строку
Наоборот.
"const char *p" - указатель на const-строку.
А "char * const p" - const-указатель на строку.
ValeryS
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
08.07.2014, 23:34     Error C2040 в пользовательском классе #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Наоборот.
"const char *p" - указатель на const-строку.
А "char * const p" - const-указатель на строку.
спасибо
всегда путаюсь с применением cоnst
приходится со справочником сидеть

Добавлено через 4 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
То же самое, что
"слона то я и не приметил"
действительно, он же объект не создает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 23:55     Error C2040 в пользовательском классе
Еще ссылки по теме:

Перегрузка оператора operator+() в пользовательском классе (сложение строк) C++
Реализовать умножение матриц в пользовательском классе "Матрица" C++
В пользовательском классе "Матрица" реализовать функцию-член для вычисления определителя C++
C++ Почему не срабатывает конструктор копирования в пользовательском классе
В пользовательском классе List (список) реализовать вставку элемента после заданного элемента C++

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

Или воспользуйтесь поиском по форуму:
Убежденный
08.07.2014, 23:55     Error C2040 в пользовательском классе
  #8

Не по теме:


Цитата Сообщение от ValeryS Посмотреть сообщение
всегда путаюсь с применением cоnst
приходится со справочником сидеть
Значит, применять const надо почаще !

Yandex
Объявления
08.07.2014, 23:55     Error C2040 в пользовательском классе
Ответ Создать тему
Опции темы

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