Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    Lyrik

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM

    Цитата:
    void aaa::Init(const string &name,...)  
    {  
       mName=name; //а так льзя?  
    }

    нет есно. xterm прав. дополню по поводу:

    Цитата:
    const string& GetName() const;


    Цитата:
    а последняя const говорит компилятору что эта функция не должна менять данные внутри класса, соответственно если такая попытка будет, вылезет ошибка компиляции.

    на самом деле в методе можно менять значение данных класса, но только mutable данных.
     
    Добавлено:
    akaGM
    глянул код. там так меняется член данных mName класса RefinablePar, а не член данных класса RefParType, где и идет объявление const string mName.

    Всего записей: 388 | Зарегистр. 04-04-2006 | Отправлено: 16:32 23-10-2009
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Lyrik
    гы Зоркий Сокол, спасибо...
    извиняйте, что напряг всех своим "знанием" С++
    всё равно придётся всё конвертировать
     


    ещё вопрос:

    Код:
    #define Vector_long  Vector<long>
     
    Vector -- класс
     
    int N = 30;
    Vector_long swapIndex(N);

    правильно я понимаю, что swapIndex в какой-то мере просто массив N-лонгов (ну там со своими методами-операторами -- это сейчас неважно)?
    и обращение
    swapIndex(10) = 5;
    в этом смысле можно при конвертации заменить на
    swapIndex[10] = 5 ?
     
    Vector_long aaa;
    тогда это что, "скаляр"?

    Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 16:43 23-10-2009 | Исправлено: akaGM, 17:15 23-10-2009
    Lyrik

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM

    Цитата:
    и обращение  
    swapIndex(10) = 5;  
    в этом смысле можно при конвертации заменить на  
    swapIndex[10] = 5 ?

    насколько я понимаю в классе Vector определен operator(), но если там не определен operator [], то по идее нельзя будет так заменить. но если переименовать operator () в operator [] то должно работать.

    Цитата:
    Vector_long aaa;  
    тогда это что, "скаляр"?

    трудно что-то сказать без конструктора и самого класса. но если разработчики пытались сделать свой класс похожим на стандартный STL вектор, то тогда при объявлении Vector_long aaa - это неициализированный вектор, т.е. вектор, имеющий 0 длину, но дальше по коду он может "превратиться" в полноценный вектор.

    Всего записей: 388 | Зарегистр. 04-04-2006 | Отправлено: 17:23 23-10-2009
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Lyrik
    это из Blitz++ Vector library
    http://www.oonumerics.org/blitz/
     

    Цитата:
    но если переименовать operator () в operator [] то должно работать

    сорри, что сразу не оговорил задачу:
    мне надо выкусить/конвертнуть из С++ библиотеки реализацию одного класса
    сделать его автономным и в перспективе перевести на фортран

    Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 17:32 23-10-2009
    optimized

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    del

    Всего записей: 125 | Зарегистр. 18-10-2008 | Отправлено: 11:07 25-10-2009 | Исправлено: optimized, 11:20 25-10-2009
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Код:
    vector<double>::iterator itr;
    static vector<double> params;
     
    for(itr = params.begin(); itr != params.end(); itr++) {}

     
    по чему этот цикл, по динамическому размеру params?
     

    Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 19:11 26-10-2009
    RFTP



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM,
    itr - это итератор, который условно можно назвать указателем
    params.begin() - возвращает указатель на первый элемент массива
    params.end() - возвращает указатель на память после последнего элемента массива
    itr++ переместить указатель itr на 1 элемент вправо
    То есть это цикл по всем элементам массива, а итератор последовательно указывает на каждый из них.

    Всего записей: 26 | Зарегистр. 24-10-2009 | Отправлено: 21:02 26-10-2009
    Quidnam



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здравствуйте товарищи.
     
    Занимался изучением абстрактных классов и натолкнулся на такой вопрос.
    Как из текущего объекта - Base* myClass = new SubClass();
    Создать новый объект, типа SubClass* = new SubSubClass();
    При этом перенести все данные полученные в конструкторе Base и SubClass.
     
    Звучит наверное странно, Вы наверное скажите передайте по ссылке объект и всё тут.
    Но возникают много трудностей. Предлагаю следующий код: (Внизу в функции main закоментированно описана проблема подробней)
     

    Код:
    #include <iostream>
    #include <string>
    #include <conio.h>
    using namespace std;
     
    class Food
    {
    public:
        Food()
        {  
            cout << "What is the name of this food? - ";
            cin >> mName;
            cout << "How many calories in this food? - ";
            cin >> mCals;
            cout << "What is the shape of this food? - ";
            cin >> mShape;
        }
     
        virtual void Info() const = 0;
        virtual bool Check() const = 0;
     
        int mCals;
        string mShape;
        string mName;
    };
     
    class Member : public Food
    {
    public:
        Member()
        {
            cout << "What colour is it? - ";
            cin >> mColour;
        }
     
        virtual void Info() const
        {
            cout << "\n" << mName << " has " << mCals
                << " it is a " << mColour << " " << mShape;
        }
     
        virtual bool Check() const
        {
            if(mName == "Apple") { return true; }
            return false;
        }
     
        string mColour;
    };
     
    class NotMember : public Member
    {
    public:
        NotMember()
        {
            cout << "How much does it weight? - ";
            _flushall();
            getline( cin, mHeavy, '\n' );
        }
     
        virtual void Info() const
        {
            cout << "\n"  << mName << " has " << mCals << " calories"
                << ", it is a " << mColour << " " << mShape
                << "\nIt weights " << mHeavy << ", and its not a fruit!";
        }
     
    protected:
        string mHeavy;
    };
     
    class NotMember2 : public NotMember
    {
    public:
        NotMember2()
        {
            cout << "Is it an Expensive fruit? (y/n)";
            if (_getch() == 'y') { mExpensive = "true"; }
            else { mExpensive = "false"; }
        }
     
        virtual void Info() const
        {
            cout << "\n"  << mName << " has " << mCals << " calories"
                << ", it is a " << mColour << " " << mShape << "."
                << "\nIt weights " << mHeavy << ", and its not a fruit!\n"
                << "It is " << mExpensive << " that this food is expensive.";
        }
     
    protected:
        string mExpensive;
    };
     
    class FruitMember : public Member
    {
    public:
        FruitMember()
        {
            cout << "Is it a tropical fruit? (y/n)";
            if (_getch() == 'y') { mTropical = "true"; }
            else { mTropical = "false"; }
        }
     
     
        virtual void Info() const
        {
            cout << "\n" << mName << " has " << mCals << " calories"
                << ", it is a " << mColour << " " << mShape
                << ". It is " << mTropical << " that this fruit is tropical.";
        }
     
    protected:
        string mTropical;
    };
     
    class FruitMember2 : public FruitMember
    {
    public:
        FruitMember2()
        {
            cout << "\nIs it a European fruit? (y/n)";
            if (_getch() == 'y') { mEuropean = "true"; }
            else { mEuropean = "false"; }
        }
     
        virtual void Info() const
        {
            cout << "\n" << mName << " has " << mCals << " calories"
                << ", it is a " << mColour << " " << mShape
                << ".\n It is " << mTropical << " that this fruit is tropical.\n"
                << "It is " << mEuropean << " that this fruit is European.";
        }
     
    protected:
        string mEuropean;
    };
     
    int main()
    {
     
        Food* myFood;
        myFood = new Member;
        if (myFood->Check()) //Проверяет если введенное название фрукта - Apple
        {
            //Здесь должен быть код, который создаст объект FruitMember2,
            //при этом вызовет конструктор FruitMember и при этом же
            //сохранит все данные которые были введены в конструкторах
            //вызванных с помощью myFood = new Member;
            //Если сюда поместить Food* myFruit = new FruitMember2;
            //То вызовутся все конструкторы, включая тех, которые были
            //вызваны с помощью myFood = new Member;
            //Если сюда поместить MyFruitMember* myFruit = new FruitMember2
            //то не будут инициализированны прошлые данные из myFood
            //Если в конструктор передать по ссылке -
            //myFruit = new FruitMember2(myFood), то возникнет множество
            //не приятных проблем...
        }  
        else
        {
            //Здесь то же самое, что выше описано, но для объекта NotMember2
        }
     
        return 0;
    };

     
    Другими словами, задача заключалась в том, чтобы при определенных данных введенных в конструкторе Member, создавался объект Food* myFruit = new FruitMember2; Но в этом объекте должны присутствовать данные уже введенные в конструкторе Member (Иначе их придётся заново вводить).

    Всего записей: 3 | Зарегистр. 23-10-2009 | Отправлено: 21:08 26-10-2009 | Исправлено: Quidnam, 21:15 26-10-2009
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RFTP
    ок, спасибо, ясно...
    и всё-таки
    Цитата:
    по динамическому размеру params?

    тождественно
    Цитата:
    То есть это цикл по всем элементам массива

    для рабоче-крестьянского (условно)
    for (int i = 0; i < sizeof(params); i++) params[i]...

    Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 21:09 26-10-2009 | Исправлено: akaGM, 21:12 26-10-2009
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    По рабоче-крестьянски это будет for (int i = 0; i < params.size(); i++) params[i]...
    То бишь цикл не по всем элементам массива, а по заполненным элементам.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6079 | Зарегистр. 22-10-2005 | Отправлено: 21:28 26-10-2009 | Исправлено: Abs62, 21:33 26-10-2009
    RFTP



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Quidnam, зачем объекту класса Апельсин присваивать значения объекта типа Фрукт (который может быть на самом деле несовместимым по дереву наследования Яблоком), трудно понять... Но если действительно нужно, то следует на всех уровнях наследования добавить конструкторы типа:
    Child(const Parent* p);
    или же перегрузить оператор = :
    Child& Child::operator=(const Parent& p);

    Всего записей: 26 | Зарегистр. 24-10-2009 | Отправлено: 21:38 26-10-2009
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    а зачем мне незаполненные?
    и итераторный params.size() мне не нужен
    захотел, маллокнул десяток, заполнил, по ним и прошёлся...

    Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 21:51 26-10-2009
    Quidnam



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
     
     зачем объекту класса Апельсин присваивать значения объекта типа Фрукт (который может быть на самом деле несовместимым по дереву наследования Яблоком)
     

     
    Смысл был в том, что пользователь вводит некие данные, а дальше как Вы совершенно точно сказали, определяется какое дерево наследования выбрать. Можно конечно, сначала попросить ввести данные, дальше сделать проверку и только потом создать нужный объект. Но смысл был так же в том, чтобы, Фрукт и Мясо и Горох принадлежали классу Food ( еда ) Если Вы знаете способ, как это сделать лучше, я с удовольствием выслушаю Вас.

    Всего записей: 3 | Зарегистр. 23-10-2009 | Отправлено: 21:52 26-10-2009
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    А затем, что в общем случае на момент выделения памяти может ещё быть неизвестно, сколько элементов заполнится в итоге.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6079 | Зарегистр. 22-10-2005 | Отправлено: 21:59 26-10-2009
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    я знаю!
    я сам себе main() гы

    Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 22:00 26-10-2009
    RFTP



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Можно конечно, сначала попросить ввести данные, дальше сделать проверку и только потом создать нужный объект. Но смысл был так же в том, чтобы, Фрукт и Мясо и Горох принадлежали классу Food ( еда )  

    Первое высказывание не исключает второго. Вместо функции Food.Check() можно создать другую, внешнюю - генератор объектов:

    Код:
     
    Food* createFood()
    {
            int mCals;
            string mShape;
            string mName;
            cout << "What is the name of this food? - ";
            cin >> mName;
            cout << "How many calories in this food? - ";
            cin >> mCals;
            cout << "What is the shape of this food? - ";
            cin >> mShape;
            if(mName == "Apple") return new Member(mName,mCals,mShape);
            else return new Food(mName,mCals,mShape);
    }
     

    Всего записей: 26 | Зарегистр. 24-10-2009 | Отправлено: 10:10 27-10-2009 | Исправлено: RFTP, 10:10 27-10-2009
    Quidnam



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    внешнюю - генератор объектов:

     
    Гениально! Спасибо RFTP.

    Всего записей: 3 | Зарегистр. 23-10-2009 | Отправлено: 19:47 27-10-2009
    BeTeP1

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Делал функцию  
    bool _func(int a, char*b ,char* lpbuf);
    #define func( buf ) _func( __LINE__, __FILE__ , buf)
     
    все нормально робит
    потребовалась функция с переменным числом аргументов, пытаюсь ее переопределить
    bool _func(int a, char*b ,char* lpFormat, ...);
    #define func(format,...) _func( __LINE__, __FILE__ , lpFormat, ....)
     
    при компиляции выдает ошибки
    Как это сделать?
     
    Добавлено:
    решение нашел на rsdn.ru

    Всего записей: 11 | Зарегистр. 23-10-2007 | Отправлено: 20:31 28-10-2009
    Infinite Retrieval

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А как нормально считать строку на русском в консоли?
    Настройки проекта и всякие: setlocale(LC_ALL,"rus"); setlocale(LC_ALL, ".1251");  setlocale(LC_ALL,".866"); не помогают..

    Всего записей: 707 | Зарегистр. 22-02-2008 | Отправлено: 20:51 28-10-2009
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Infinite Retrieval
    Вариант 1: использовать функции OemToChar/CharToOem для преобразования введённой строки.
    Вариант 2: выставить кодировку ".866" и использовать юникодные функции ввода.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6079 | Зарегистр. 22-10-2005 | Отправлено: 21:15 28-10-2009
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru