Модераторы: 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   Вверх
JackYF
Дата 25.2.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sol78 @  23.2.2008,  19:52 Найти цитируемый пост)
operator String ()

Код

operator String() const

пробуй. И пользуйся тегом с подстветкой С++, пожалуйста.



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


Опытный
**


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

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



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


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


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

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



Цитата(sol78 @  23.2.2008,  19:52 Найти цитируемый пост)
String operator+(const String& str)const

ага, понял. потому как первый аргумент не объект класса String.

Для того, чтобы это заработало, вынеси operator+ во внешнюю функцию с двумя аргументами String.


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


Опытный
**


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

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



Код

cout<<(String)s1("This")+s2; //Так тоже сработало

JackYF,  Только не знаю что предпочтительней....интерфейс менять что то не хочется....?

Вот следующая проблема:

Для работы с константными обьектами..
я делаю так:

class String:

Код

SubString String::operator()(const char* substr)
{
    SubString sstr(*this, substr);
    return  sstr;
}

const SubString String:: operator()(const char* substr)const
{
    SubString sstr(*this, substr);
    return  sstr;
}

        
SubString String::operator()(int position, size_t length)
{
    SubString sstr(*this, position, length);
    return sstr;
}

const SubString String::operator()(int position, size_t length)const
{
    SubString sstr(*this, position, length);
     return sstr;
}    


SubString String::operator()(int position)
{
    SubString sstr(*this, position);
    return sstr;
}

const SubString String::operator()(int position)const
{
    SubString sstr(*this, position);
    return sstr;
}


т.е. по паре операторов 1 для const  другой обычный...

class SubString
Код

//.......
          //constructors
            SubString(String & str, const char* sstr);  
            SubString(String & str, int position, size_t length=0);
....
         SubString& operator = (const String& source);// izmenyaet this!!!
.....

Должно работать так:
Код

const String s1 ("Ku-ku");
s1("-")="mu" //Compilation Error - s1 is const 


Но не работает...ругается на приведении типов (const - ne const)
Как быть?




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


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


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

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



Цитата(sol78 @  28.2.2008,  22:20 Найти цитируемый пост)
интерфейс менять что то не хочется

фанатизм? вынесение оператора+ в функции вне класса - распространённая практика, и для строк, в частности, тоже

Цитата(sol78 @  28.2.2008,  22:20 Найти цитируемый пост)
s1("-")="mu" //Compilation Error - s1 is const 

абсолютно верно. Это дикий кусок кода, зачем он может быть нужен?


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


Опытный
**


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

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



Цитата(JackYF @ 28.2.2008,  23:25)
фанатизм? вынесение оператора+ в функции вне класса - распространённая практика, и для строк, в частности, тоже


Согласна, но  это каснется не только одного оператора +, но ище штук 7-8 таких же....
Цитата

абсолютно верно. Это дикий кусок кода, зачем он может быть нужен?

Ничего дикого тут нет....s1("-")="mu" - эта комбинация напоминает некий аналог copy-paste , когда работаем в Worde
Цитата

абсолютно верно

это вы о чем?
PM MAIL   Вверх
JackYF
Дата 28.2.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sol78 @  28.2.2008,  22:36 Найти цитируемый пост)
Согласна, но  это каснется не только одного оператора +, но ище штук 7-8 таких же....

не понял, почему?

Цитата(sol78 @  28.2.2008,  22:36 Найти цитируемый пост)
s1("-")

подстрока константного объекта по определению константна, а ты хочешь ей чего-то присвоить...

Цитата(sol78 @  28.2.2008,  22:36 Найти цитируемый пост)
это вы о чем? 

о том, что компилятор верно ругается



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


Опытный
**


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

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



да правильно все, так и должно быть, для этого и весь сыр-бор....
Проблема не там....
Код

const SubString String:: operator()(const char* substr)const
{
    SubString sstr(*this, substr); //например тут мне не нужно чтобы this был конст????
    return  sstr;
}

 


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


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


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

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



Цитата(sol78 @  28.2.2008,  22:59 Найти цитируемый пост)
SubString sstr(*this, substr)

Код

const SubString sstr(*this, substr);



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


Опытный
**


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

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



JackYF,  неаб не помогло...
Код

const SubString String:: operator()(const char* substr)const
{
    const SubString sstr(*this, substr); //ругается на *this, что он не кост
    return  sstr;
}


PM MAIL   Вверх
JackYF
Дата 29.2.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sol78 @  29.2.2008,  15:08 Найти цитируемый пост)
const SubString sstr(*this, substr); 

Код

const SubString sstr(const_cast<const String&>(*this), substr);



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


Опытный
**


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

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



JackYF,  не работает...
Что делает оператор const_cast<const String&>?
PM MAIL   Вверх
JackYF
Дата 29.2.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sol78 @  29.2.2008,  20:26 Найти цитируемый пост)
то делает оператор const_cast<const String&>? 

вообще - изменение константности.
а если так: "const_cast<String&>"?

Цитата(sol78 @  29.2.2008,  20:26 Найти цитируемый пост)
JackYF,  не работает...

и ошибку, ошибку в студию...


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


Опытный
**


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

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



Вот так заработало
Код

const SubString String:: operator()(const char* substr)const
{
     SubString sstr(const_cast<String&>(*this), substr);
    return  sstr;
}

Обьясните, плз ,какова тут функция оператора const_cast<String&>(*this)...Я этот оператор никогда не использавала?
Если интерфейс констуктора для субстринга:
Код

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


PM MAIL   Вверх
JackYF
Дата 1.3.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sol78 @  1.3.2008,  17:43 Найти цитируемый пост)
какова тут функция оператора const_cast<String&>(*this)

в данной функции *this имеет тип const String&, так это константная функция класса. Конструктор же вышеуказанный принимает String&, а не const String&, следовательно мы используем const_cast - отмену константности.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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