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

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

Восстановить пароль Регистрация
 
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
08.07.2014, 21:25     Error C2040 в пользовательском классе #1
Функция 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 в пользовательском классе
Посмотрите здесь:

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? C++
C++ error C2040: key: "int [256]" отличается по уровням косвенного обращения от "std::ofstream"
Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе C++
Массив в классе. Ошибка error: invalid use of non-static data member C++
C++ C2446 и C2040 ошибки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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" );
Убежденный
Системный программист
 Аватар для Убежденный
14188 / 6203 / 984
Регистрация: 02.05.2013
Сообщений: 10,331
Завершенные тесты: 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
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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 в пользовательском классе
Еще ссылки по теме:

C++ Выдает ошибку c:\proect\8\8\8.cpp(60): error C2040: ==: "char [20]" отличается по уровням косвенного обращения от "int"
C++ Корректно ли будет работать функция realloc в пользовательском классе массива
В классе инициализировать массив, в классе создать функцию вывода массива на экран C++

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

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

Не по теме:


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

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

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