2013-04-20 4 views
0

Так как вы знаете: строка типа C представляет собой массив символов, который заканчивается с «нулевым»Общий класс, который принимает C++ строку & C строку стиля

C++ строка стиль:

string s = "Some text"; 

так принимаем как строку C++, так и строку стиля C, я уверен, что мне нужно использовать шаблон C++.

Я пытаюсь написать класс и метод, который возвращает второй символ строки для строки стиля C++ или C. Я на правильном пути?

template <class T> 
    class mystring { 
    T pointer; 

    public: 
    mystring(T input) { pointer = input } 
    char getSecondLetter() { 
     T temp = pointer; 
     temp++; 
     return temp; 
    } 
}; 

int main() { 
    mystring<I dont know what to put> myobject("HELLO"); 
    cout << myobject.getSecondLetter(); 
    return 0; 
} 

p.s. Всегда ли программисты используют «T» для типа данных класса шаблона?

+1

Определить «принять». Есть ли что-то, что 'std :: string' делает * not * для вас, что вам нужно (и, отвечая на это, рассмотрите член' c_str() ', который позволяет ему представлять извне как строку с завершающим нулем). ? Кроме того, должен ли быть класс/метод? Почему не просто пара перегруженных функций? – WhozCraig

+0

Извините, я не понимаю ваш комментарий = (Я пытаюсь реализовать свою собственную функцию/класс, не используя заданные функции библиотеки, которые будут принимать строку c или cpp и выполнять некоторые операции над строкой –

+0

@JL Нет, программисты не всегда используйте 'T', но это стандарт. – timss

ответ

4

нет необходимости, C строка неявно преобразовать в StD :: строка

char getSecondLetter(const std::string & s) { 
    return s[1]; 
} 

const char *c_str = "hello"; 
std::string str = "world"; 

getSecondLetter(c_str); // e 
getSecondLetter(str);  // o 
+0

Спасибо. Но я уже знал метод c_str() и не хотел его использовать. Я пытаюсь практиковать «общий класс» и пытаюсь научиться использовать общий класс для принятия строки стиля c или строки cpp и выполнять операции, такие как return char в индексе X или заглавные буквы и т. Д. –

+0

лучше использовать 'const char * c_str = "hello" 'поскольку' char * 'устарел для строкового литерала. – taocp

+0

Волатильный указатель 'c_str' будет помечен самолюбивым современным компилятором C++ в качестве устаревшей функции. Он должен быть объявлен как инициализированный массив или 'const char *', чтобы быть совместимым. – WhozCraig

0

Вам не нужно шаблоны для этого - вы можете просто использовать это:

class mystring { 
    std::string str; 
public: 
    mystring(std::string input) : str(input) {} 
    char getSecondLetter() { 
     return str[1]; 
    } 
}; 

С станд :: string имеет конструктор, который принимает const char*, когда вы пишете mystring("hello"), ваш const char * будет неявно преобразован в std :: string с использованием конструктора строк перед передачей вашему конструктору класса.

+0

, избегая двойной конструкции, 'const std :: string & input' будет лучшим совпадением, но даже тогда она делает копию ввода, что я не уверен, что OP ищет (не удивительно). – WhozCraig

3

Вы можете сделать шаблон:

template<typename Str_T> 
char getSecondLetter(Str_T const & str) { return str[1]; } 

Это позволит как std::string и char const*. Но это также позволит сделать что-нибудь еще, что имеет operator[], который возвращает символ или что-то, конвертируемое в char (например, std::vector<char>, или std::deque<char>). Если вы хотите ограничить его только std::string и char const*, то вы можете просто написать две перегруженные:

char getSecondLetter(std::string const & str) { return str[1]; } 
char getSecondLetter(char const * str) { return str[1]; } 

Конечно, вы также можете сделать, как другие показали, и просто сделать одну версию, которая принимает std::string. Но имейте в виду, что если вы передадите ему c-строку, преобразование в std::string, скорее всего, приведет к распределению памяти, которое будет освобождено только после завершения функции.

+0

+1 Многопользовательский взнос - это бонус и, по крайней мере, заставит OP подумать о том, как шаблоны расширяются, чтобы охватить больше, чем он, возможно, впервые рассмотрел. Хороший ответ. – WhozCraig

+0

Хм .. Ну да, теоретически мне хотелось бы только std :: string & char const *, но если используются два упомянутых метода перегрузки, я не думаю, что класс рассматривается как общий класс. Параметр для функций уже задан тип данных, а не общий. Я прав? –

0

повышение :: string_ref может быть то, что вы ищете: [http://www.boost.org/doc/libs/1_53_0/libs/utility/doc/html/string_ref.html]

Это легкий класс, который может быть построен из строки или c-массива и поддерживает неизменяемую часть интерфейса std :: string.

Смежные вопросы