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

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

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

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

08.07.2014, 21:25. Просмотров 430. Ответов 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 <<"\".";
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2014, 21:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Error C2040 в пользовательском классе (C++):

Неправильная работа сложения в пользовательском классе - C++
Вечер добрый. Написал свой класс Money. Решил протестировать, и наткнулся на ошибку. #include &lt;iostream&gt; #include &quot;Money.h&quot; using...

Почему не срабатывает конструктор копирования в пользовательском классе - C++
вроде со всем разобралась, но не заходит в конструктор копирования. В чём ошибка? #include &lt;iostream&gt; #include &quot;welcome.h&quot; ...

Реализовать в пользовательском классе дружественную функцию согласно условию - C++
Помогите пожалуйста, много задач за день прорешал и эту уже не понимаю(( Дан класc. Добавьте дружественную функцию ИмяФункции(),...

Перегрузка оператора operator+() в пользовательском классе (сложение строк) - C++
Хотел научить класс складывать строки, но на моменте освобождения памяти temp происходит ошибка. Поля класса: char* Str, int length...

Корректно ли будет работать функция realloc в пользовательском классе массива - C++
Доброго времени суток. Корректно ли будет работать функция realloc в пользовательском классе массива, если в этом массиве предполагается...

Реализовать умножение матриц в пользовательском классе "Матрица" - C++
Напишите ф-ции для выделения памяти под массив и умножения матриц #include &quot;stdafx.h&quot; #include&quot;iostream&quot; using namespace std; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
08.07.2014, 21:29 #2
а так

C++
1
char* str = "message";
0
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
08.07.2014, 21:32  [ТС] #3
Я тоже так сначала попытался, сделать (даже понимая что массив - указатель на его первый элемент ), но получил такую ошибку:
error C2040: str: "String" отличается по уровням косвенного обращения от "char *"
Почти то же...
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
08.07.2014, 21:54 #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 )
указатель на неизменяемую строку
1
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
08.07.2014, 22:02  [ТС] #5
Это запустилось.
C++
1
String( "message" );
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
08.07.2014, 22:19 #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-указатель на строку.
2
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
08.07.2014, 23:34 #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Наоборот.
"const char *p" - указатель на const-строку.
А "char * const p" - const-указатель на строку.
спасибо
всегда путаюсь с применением cоnst
приходится со справочником сидеть

Добавлено через 4 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
То же самое, что
"слона то я и не приметил"
действительно, он же объект не создает
0
Убежденный
08.07.2014, 23:55     Error C2040 в пользовательском классе
  #8

Не по теме:


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

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

В пользовательском классе List (список) реализовать вставку элемента после заданного элемента - C++
Помогите пожалуйста, мне надо сделать вставку элемента после найденного, а у меня элемент добавляется на место первого элемента. ...

В пользовательском классе "Матрица" реализовать функцию-член для вычисления определителя - C++
Прива всем. Такой вопрос. Написал класс &quot;Матрица&quot;. Хочу добавить метод для вычисления определителя. Написал функцию (&quot;не для класса&quot;)...

error C2040: key: "int [256]" отличается по уровням косвенного обращения от "std::ofstream" - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include &lt;string&gt; using namespace std; #define size...

Выдает ошибку c:\proect\8\8\8.cpp(60): error C2040: ==: "char [20]" отличается по уровням косвенного обращения от "int" - C++
Программа должна выводить фамилии всех нападающих с датой рождения из основного состава #include&quot;stdafx.h&quot; #include&quot;iostream&quot; ...


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

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

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