Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator casting 
:(
    Опции темы
sol78
Дата 19.2.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



Помогите, плиз, не могу понять, почему автоматически не вызывается оператор кастинг
Я пишу свой класс  String
String.h

Код

class SubString;

class String
{
    SmartPointer sp;
    size_t length;
     ...

    public:
    explicit    String(const char* str=0); //Constructor
        

       //operators overloading
      //operators for create SubString
        SubString& operator()(const char*);
       const SubString& operator()(const char*)const;
...
friend ostream& operator<< (ostream& out , const String& str);

и класс SubString
SubString.h
Код

class String;

class SubString

{

            String& ref_str; //reference to String class

            int position;

            size_t length;

public:

            SubString(String & str, int pos, size_t len):ref_str(str)
            {
                position=pos;
                length=len;
            }
        //operator casting to class String
        operator String ()
        {
              return ref_str;
        }
};

вызываю так:
Код

int main()
{
String s1("Irina");
cout<<s1("rina"); //ошибка не узнает кастинг
}


И еще вопрос в данный момент SubString это public class c public contrustor
Что лучше использовать, для того чтобы закрыть SubString с внешней стороны, но чтоб он оставался открытым для String?
friend class, inner или что еще?


PM MAIL   Вверх
just_geek
Дата 19.2.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 2
Всего: 10



А собственно зачем нужен еще класс SubString? На мой взгляд и одного String хватит... Зачем же такие сложности... Да и вообще зачем еще один велосипед писать? (:
PM MAIL   Вверх
JackYF
Дата 19.2.2008, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(sol78 @  19.2.2008,  18:54 Найти цитируемый пост)
s1("rina")

у класса String определён operator()? если нет, то этот кусок кода не логичен


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sol78
Дата 19.2.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



JackYF, 
конечно -  SubString& operator()(const char*);


just_geek,  в целях обучения
PM MAIL   Вверх
Fazil6
Дата 19.2.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



а какой текст ошибки?
Вроде правильно у тебя
PM MAIL   Вверх
sol78
Дата 19.2.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



Fazil6, 
C:\Documents and Settings\Irina\My Documents\String\Test.cpp(18) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class SubString' (or there is no acceptable conversion)
PM MAIL   Вверх
Fazil6
Дата 20.2.2008, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



sol78, 
единственное, что приходит на ум в данной ситуации - это то, что в месте 
Код

cout<<s1("rina"); //ошибка не узнает кастинг

не видно полного описания твоего SubString. Видимо у тебя есть хедер в котором описан String и его ты подключаешь, но там только forward decl для класса SubString
PM MAIL   Вверх
sol78
Дата 21.2.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



Fazil6, 
совершенно верно, ошибка была там, спасибо!

Только вот что у меня класс SubString не идет, голову поломала...как его лучше спроектировать,
известно только что он должен обеспечивать следующее:
Код

const String str1("this the string exemple");
cout<< str1("this")+"or that"; //this or that
cout<< str1("that")+"or this"; //or this
str1("this")=a;//error-str1 is const


У меня есть оператор ():

 SubString& operator()(const char*);
 const SubString& operator()(const char*)const;

У меня вопрос, как лучше проверить является ли субстринг частью стринга в операторе () или в самом конструкторе
субстринг?
при условии что если не является, нужно что то делать...не знаю дефолтний конструктор?

для реализации cout<< str1("this")+"or that"; //this or that
у меня есть оператор кастинг, благодаря ему печатеется стринг, а нужно чтоб субстринг, как ето сделать?


PM MAIL   Вверх
vadiml
Дата 21.2.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



посмотри в исходниках Qt ( в Qt4 -- QtCore -> qstring.h/cpp, qbytearray.h/cpp )
там такое уже всё сделано
PM MAIL Jabber   Вверх
sol78
Дата 21.2.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



Цитата(vadiml @ 21.2.2008,  21:43)
посмотри в исходниках Qt ( в Qt4 -- QtCore -> qstring.h/cpp, qbytearray.h/cpp )
там такое уже всё сделано

как и где посмотреть?
PM MAIL   Вверх
sol78
Дата 21.2.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



нашла, но мало что понятно smile 
PM MAIL   Вверх
Lycifer
Дата 22.2.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



При перегрузки ()  в string ты возврощается SubStrign?smile  smile 
Как это в потоки вывода помещается?
А вообще нужон перегрузить +, = .
для решения:

const String str1("this the string exemple");

cout<< str1("this")+"or that"; //this or that

cout<< str1("that")+"or this"; //or this

str1("this")=a;//error-str1 is const 
PM MAIL ICQ   Вверх
Fazil6
Дата 22.2.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Lycifer @  22.2.2008,  10:22 Найти цитируемый пост)
При перегрузки ()  в string ты возврощается SubStrign?   
Как это в потоки вывода помещается?

сам не хулигань. Смотреть надо в комплексе и видны все ходы, которыми в поток помещается.

Хотя помоему дизайн этого велосипеда просто ужасающий...
PM MAIL   Вверх
sol78
Дата 23.2.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



Цитата(Fazil6 @ 22.2.2008,  13:38)
Хотя помоему дизайн этого велосипеда просто ужасающий...

обидно слушать (((.
Я думаю что от сюда хорошие стороны дизайна не видны...

Вот столкнулась с очередной проблемой:
Класс Стринг
Код

class String
{
               SmartPointer sp;
    size_t length;
    
    String concatenate(const String&)const;

    public:
        String(const char* str=0); //Constructor
        String(const char* , size_t); 
        
    //    ...

       //operators overloading

                                 SubString operator()(const char*);
        const SubString operator()(const char*)const;
    
        friend ostream& operator<< (ostream& out , const String& str);
        

        String operator+(const String& str)const
        {
                                 return concatenate(str);
        }
  //....
};

 

в субстринге

Код

class SubString

{

            String& ref_str; //reference to String class

            int position;

            size_t length;

public:
         
            SubString(String & str, const char* sstr);

                           //operator casting to class String
            operator String ()
            {
                char buf[MAX_SIZE];
                ref_str.sp.get_buff(buf);
                return String(buf+position, length);
            }
};


использую так:
Код

String s1("This is string");
String s2("Irina");
cout<<s2+s1("this");//Irinathis //работает ок
cout<<s1("this")+s2;//ошибка не признает кастинг, почему?


PM MAIL   Вверх
sol78
Дата 25.2.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



Разве проблема совсем не разрешимая? smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.