2016-02-03 2 views
-1

У меня есть этот код, но невозможно скомпилировать с g ++ или msvc. Я пытаюсь сделать пользовательский тип CharNw, что я могу использовать его в качестве строки в существующем все строках процедуры или передать в качестве аргумента всех существующих функций:C++ сбой кода типа сбой

#include <string.h> 
#include <stdio.h> 
void fx(unsigned int x) 
{ 
/*this is the reason of all this 
but is ok, not is problem here */ 
..... 
} 
class CharNw 
{ 
    int wt; 
    char cr; 

public: 
    CharNw() { wt = -1; cr = '\0'; } 
    CharNw(char c) { if wt > 0 fx((unsigned int) wt); cr = c; } 
    operator char() { if wt > 0 fx((unsigned int) wt); return cr ;} 
    assgn(int f) { wt = f;} 
}; 
int main(void) 
{ 
CharNw hs[40];   //it is ok 
CharNw tf[] = "This is not working, Why?\n"; 
char dst[40]; 
    strcpy(dst, tf); //impossible to compile 
printf("dst = %s, tf = %s", dst, tf); //too 
return 0; 
} 

может мне помочь?

+0

Используя правильный синтаксис будет хорошим первым шагом. Этот код - мусор. – LogicStuff

+0

У вас нет ничего, что преобразует * указатель на char * в массив 'CharNw'. –

+0

Это звучит как проблема XY. Зачем вам это нужно? – NathanOliver

ответ

0

По строкам.

CharNw hs[40];   //it is ok 

выше представляет собой массив объектов CharNw с мощностью 40 элементов. Это хорошо.

CharNw tf[] = "This is not working, Why?\n"; 

С правой стороны (РИТ) выполнения задания, у вас есть тип char const * const* and on the left you have an array of CharNw . The CharNw` не характер, поэтому у вас есть проблема. Предпочитают, чтобы обе стороны задания имели один и тот же тип.

char dst[40]; 

Массив символов. Ни больше ни меньше. Он имеет емкость до 40 символов. Массив dst не является строкой. Вы должны использовать #define для своих емкостей массива.

strcpy(dst, tf); //impossible to compile 

strcpy требует оба параметра, чтобы быть указателями на char. Левый параметр можно разложить на указатель на первый массив char. tf представляет собой массив CharNw, который несовместим с массивом char или указатель к char.

printf("dst = %s, tf = %s", dst, tf); //too 

printfспецификатор формата%s требует указатель на символ, предпочтительно С-типа, завершенную нулем массив (или последовательность) символов. Параметр tf представляет собой массив из CharNw, который не является массивом символов или указателем на один символ или строку C-Style.

Edit 1: Операторы преобразования
Метод operator char() в классе преобразует переменные символы в CharNw переменном. Это не относится к указателям или массивам.
Вам понадобятся некоторые беспорядочные функции преобразования указателей.

Вот примеры:

const unsigned int ARRAY_CAPACITY = 40U; 
const char text[] = "I am Sam. Sam I am." 
CharNw tf[ARRAY_CAPACITY]; 
for (unsigned int i = 0U; i < sizeof(text); ++i) 
{ 
    tf[i] = text[i]; // OK, Converts via constructor. 
} 
for (unsigned int i = 0U; i < sizeof(text); ++i) 
{ 
    printf("%c", tf[i]); // The tf[i] should use the operator char() method. 
} 

Лучший подход, чтобы объявить класс, используя std::basic_string, а не пытаться втиснуть свой класс в строковых функций C-Style.

Например:

class StringNw : public std::basic_string<CharNw> 
{ 
}; 
Смежные вопросы