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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Red Planet



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Qraizer, если я вас правильно понял, то объект класса Y преобразуется неявно в объект класса X, который потом и выводится.
     
    Еще есть вопрос. Не могу понять, почему оператору производного класса недоступен защищенный член базового класса.
     

    Цитата:
    class X {
        protected: int c, d;
        public: X () {c=1; d=1;}
        friend ostream& operator << (ostream &s, const X &);
    };
     
     
    class Y:public X {
        protected: Y *pr;
        public: Y () {pr=0;}
        Y& operator = (const Y&);
        Y& operator = (const X&);
        friend ostream& operator << (ostream &s, const Y &);
    };
     
    // не работает
    Y& Y::operator =(const X &right) {
        c=right.c;
        d=right.d;
        return *this;
    }

     
     
    Ведь защищенные члены базового становятся при публичном наследовании защищенными членами производного. Что здесь не так?

    Всего записей: 215 | Зарегистр. 18-06-2009 | Отправлено: 00:37 05-04-2011 | Исправлено: Red Planet, 00:38 05-04-2011
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Red Planet
    Производный класс имеет доступ к защищённым членам объектов только собственного типа. К защищённым членам объектов других типов у него доступа нет. Так что Y::operator = может обращаться к c, но не к right.c, так как right - объект класса X.

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

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 00:57 05-04-2011
    Qraizer



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

    Цитата:
    если я вас правильно понял, то объект класса Y преобразуется неявно в объект класса X, который потом и выводится.
    Почти. Не объект преобразуется, а ссылка на него. Сам объект тот же, копий не делается.
    Abs62, поясню с позволения. Red Planet, то, что было определено в X, никуда в Y при наследовании не переехало, оно так и осталось в области видимости класса X. Для класса Y он является окаймляющей областью видимости, в которую компилятор заглянет, если не найдёт идентификатора в текущей области видимости, то бишь в области видимости класса Y. Поэтому в
    Цитата:
    Ведь защищенные члены базового становятся при публичном наследовании защищенными членами производного. Что здесь не так?
    не так "становятся". Не "становятся", а "доступны", потому что наследуются. Просто X есть часть Y. Ты же обращается к right как к отдельной сущности, разумеется при этом задействован его публичный интерфейс.

    ----------
    Одни с годами умнеют, другие становятся старше.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 02:44 05-04-2011 | Исправлено: Qraizer, 02:47 05-04-2011
    Red Planet



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62, Qraizer, спасибо.
     

    Цитата:
    Y& Y::operator =(const X &right) {  
        c=right.c;  
        d=right.d;  
        return *this;  
    }

     
    Выход: сделать с и d в базовом классе публичными.
     

    Всего записей: 215 | Зарегистр. 18-06-2009 | Отправлено: 08:22 05-04-2011
    Abs62



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

    Цитата:
    Выход: сделать с и d в базовом классе публичными.

    Другой выход, дабы не давать прямой доступ в потроха класса кому ни попадя:

    Код:
    class X {  
    protected:
        int c, d;  
    public:
        X () {c=1; d=1;}  
        int get_c() { return c; };
        int get_d() { return d; };
        friend ostream& operator << (ostream &s, const X &);  
    };
    ...
    Y& Y::operator =(const X &right) {  
        c=right.get_c();  
        d=right.get_d();  
        return *this;  
    }  
     


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

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 08:55 05-04-2011
    Red Planet



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

    Цитата:
    int get_c() const { return c;}  
    int get_d() const { return d;}

     
    Иначе ошибка

    Цитата:
    Non-const function called for const object

     

    Всего записей: 215 | Зарегистр. 18-06-2009 | Отправлено: 20:32 05-04-2011 | Исправлено: Red Planet, 20:32 05-04-2011
    Qraizer



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Red Planet, заметь, operator<<()-у терерь совсем необязательно быть другом.

    ----------
    Одни с годами умнеют, другие становятся старше.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 02:57 06-04-2011
    V0lt



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

    Всего записей: 10493 | Зарегистр. 05-02-2003 | Отправлено: 12:28 09-04-2011 | Исправлено: V0lt, 16:58 09-04-2011
    DenisM300

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    пишу программу в Dev-C++ для работы с бинарными деревьями.
    возникла такая проблема: функция FindTree возвращает отрицательное значение, т.е. она считает, что дерево пустое и возвращает -1 до тех пор, пока не будет достигнут конец файла при считывании элементов, которые надо найти.  
    в чем причина, и как ее исправить?
     
    Код программы

    Всего записей: 4 | Зарегистр. 09-04-2011 | Отправлено: 21:23 09-04-2011 | Исправлено: DenisM300, 23:19 09-04-2011
    xzGORzx

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте!
    Такая проблема:
    Пытаюсь в среде Visual c++ получить pid процесса. таким-же способом как получал его в Dev c++, а именно:

    Код:
     
    HWND hWnd = FindWindow(0,"WindowName");
    DWORD pid;  
    GetWindowThreadProcessId(hWnd, &pid);
     

     
    Только вот проблема в том, что на Dev c++ этот код прекрасно работает, а на Visual c++ нет. Выдает ошибку:

    Код:
     
    Ошибка    1    error C2664: FindWindowW: невозможно преобразовать параметр 2 из "const char [10]" в "LPCWSTR"
     

     
    Поискал решение в гугле. При попытке использовать FindWindowA выдает еще больше:

    Код:
     
    Ошибка    2    error LNK2028: ссылка на неразрешенную лексему (0A000037) "extern "C" struct HWND__ * __stdcall FindWindowA(char const *,char const *)" (?FindWindowA@@$$J18YGPAUHWND__@@PBD0@Z) в функции "public: __clrcall Test2::Form1::Form1(void)" (??0Form1@Test2@@$$FQ$AAM@XZ)    C:\Documents and Settings\Admin\Мои документы\Visual Studio 2010\Projects\Test2\Test2\Test2.obj
     


    Код:
     
    Ошибка    3    error LNK2019: ссылка на неразрешенный внешний символ "extern "C" struct HWND__ * __stdcall FindWindowA(char const *,char const *)" (?FindWindowA@@$$J18YGPAUHWND__@@PBD0@Z) в функции "public: __clrcall Test2::Form1::Form1(void)" (??0Form1@Test2@@$$FQ$AAM@XZ)    C:\Documents and Settings\Admin\Мои документы\Visual Studio 2010\Projects\Test2\Test2\Test2.obj
     


    Код:
     
    Ошибка    4    error LNK1120: 2 неразрешенных внешних элементов    C:\Documents and Settings\Admin\Мои документы\Visual Studio 2010\Projects\Test2\Debug\Test2.exe
     

     
    Подскажите пожалуйста, как решить проблему?
     
    PS. Не принципиально таким способом, главное получить PID процесса. Например по его имени.
     
     
     
     
     
     

    Всего записей: 11 | Зарегистр. 09-12-2010 | Отправлено: 01:01 10-04-2011 | Исправлено: xzGORzx, 01:02 10-04-2011
    vlary



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xzGORzx FindWindowA находится в библиотеке user32.lib, нужно дать ссылку для линковки.
    Вместо "WindowName" используй L"WindowName"

    Всего записей: 17278 | Зарегистр. 13-06-2007 | Отправлено: 01:31 10-04-2011
    Qraizer



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Ты пыташься собрать юникодное приложение. Просто смени тип проекта на ANSI, или используй юникодные строки:
    Код:
    FindWindow(0, L"WindowName");

    Что касается FindWindowA(), то ты наверняка собираешь C++ CLI-приложение, объявил её прототип сам и при всём этом забыл о том, что extern "C" к CLI имеет весьма слабое отношение. Ты проекту тип CLI намеренно выбрал или случайно?

    ----------
    Одни с годами умнеют, другие становятся старше.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 01:31 10-04-2011 | Исправлено: Qraizer, 01:34 10-04-2011
    xzGORzx

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Тоже пробовал так сделать. Вываливает это:

    Код:
     
    Ошибка    2    error LNK2028: ссылка на неразрешенную лексему (0A000037) "extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const *,wchar_t const *)" (?FindWindowW@@$$J18YGPAUHWND__@@PB_W0@Z) в функции "public: __clrcall Test2::Form1::Form1(void)" (??0Form1@Test2@@$$FQ$AAM@XZ)    C:\Documents and Settings\Admin\Мои документы\Visual Studio 2010\Projects\Test2\Test2\Test2.obj
     


    Код:
     
    Ошибка    3    error LNK2019: ссылка на неразрешенный внешний символ "extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const *,wchar_t const *)" (?FindWindowW@@$$J18YGPAUHWND__@@PB_W0@Z) в функции "public: __clrcall Test2::Form1::Form1(void)" (??0Form1@Test2@@$$FQ$AAM@XZ)    C:\Documents and Settings\Admin\Мои документы\Visual Studio 2010\Projects\Test2\Test2\Test2.obj
     


    Код:
     
    Ошибка    4    error LNK1120: 2 неразрешенных внешних элементов    C:\Documents and Settings\Admin\Мои документы\Visual Studio 2010\Projects\Test2\Debug\Test2.exe    1
     

     
    Он становится CLI когда добавляешь к нему вин форму.
     
    Простите, как сменить тип проекта? Не потеряется ли от этого поддержка русских символов?

    Всего записей: 11 | Зарегистр. 09-12-2010 | Отправлено: 09:12 10-04-2011 | Исправлено: xzGORzx, 09:36 10-04-2011
    ValidolX

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DenisM300
    что за программа такая? что за слова "or" в коде?
     
    2) почему нету начального состаояния переменной дерева7
    вот так никуда ни годиться
    derevo tl, t;
    надо derevo tl = NULL, t = NULL;
     
    как найти ошибку - постройте релиз и сразу будет гав

    Всего записей: 1713 | Зарегистр. 22-07-2001 | Отправлено: 11:54 10-04-2011
    KChernov



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ValidolX
    Ну при таком коде - скорее всего его ещё ни разу не пробовали компилировать.
    И тем более странно, что задаётся вопрос почему не работает правильно.
    Конечно работать с Dev-C++ не приходилось - мб там есть какие особенности?..

    Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 12:11 10-04-2011
    DenisM300

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ну если бы я ни разу не пробовал компилировать, то откуда бы я мог знать, что функция поиска возвращает отрицательные значения?

    Всего записей: 4 | Зарегистр. 09-04-2011 | Отправлено: 15:20 11-04-2011
    KChernov



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

    Цитата:
    ну если бы я ни разу не пробовал компилировать, то откуда бы я мог знать, что функция поиска возвращает отрицательные значения?

    Ну мало ли. Может препод сказал.
     
    У меня ваш код вообще не компилируется.
    Может конечно стандарт С из Dev-C++ так сильно отличается от стандарта С VS2008 (вообще конечно МС зачастую грешит некоторыми отступлениями от стандарта).
    А может вы выложили не тот код.
    Как минимум or в С - это что-то новое.

    Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 16:47 11-04-2011 | Исправлено: KChernov, 16:49 11-04-2011
    kotlomoy



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

    Код:
                  derevo t;
                    int z = 0;
                    system("cls");
                    ifstream in_file("input.txt");
                    while (!in_file.eof())
                    {
                          in_file >> find_word;
                          FindTree(find_word, &t);  
                          z = z + FindTree(find_word, &t);
                    }
     

     
    Здесь вы создается указатель t, никакого значения ему не присваивается. Неинициализированный указатель передается в функцию FindTree.
     

    Код:
    int FindTree(char find_word[64], derevo *t)
    {
         if (*t == NULL)
             kol = -1;  

     
    Здесь проверяется значение неинициализированного указателя. И что вы ожидаете увидеть?
     

    Всего записей: 172 | Зарегистр. 06-03-2008 | Отправлено: 20:22 11-04-2011
    DenisM300

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

    Цитата:
    Ну мало ли. Может препод сказал.
     
    У меня ваш код вообще не компилируется.
    Может конечно стандарт С из Dev-C++ так сильно отличается от стандарта С VS2008 (вообще конечно МС зачастую грешит некоторыми отступлениями от стандарта).
    А может вы выложили не тот код.
    Как минимум or в С - это что-то новое.

    это не С, а С++
    а VS действительно отличается... сталкивался.
     
    2 kotlomoy
    подскажите, как исправить? у меня еще не хватает познаний в программировании, чтоб писать без ошибок

    Всего записей: 4 | Зарегистр. 09-04-2011 | Отправлено: 22:29 11-04-2011
    Red Planet



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения "знал" операнда-наследника (для того и сделан в нем указатель prev). Может быть, лучше это сделать по-другому? Если да, то как? Если нет, то скажите, что дописать в операторах?

    Цитата:
    class A {
        protected: double x, y;
        public: A () {x=1; y=1;}
        double get_x () {return x;}
        double get_y () {return y;}
    };
     
    class B:public A {
        B *prev;
        public: B () {prev=0;}
        B (const B &);
        ~B () {delete prev;}
        B& operator = (const A &);
        B& operator = (const B &);
        friend ostream& operator << (ostream &, const B &);
        friend B operator + (B, A);
    };
     
     
    // Копирующий конструктор наследника.
    B::B (const B &right) {
        prev=0;
        x=right.x;
        y=right.y;
    }
     
     
    // Присваивание экземпляру наследника экземпляра родителя.
    B& B::operator =(const A &right) {
        x=right.get_x();
        y=right.get_y();
        return *this;
    }
     
     
    // Присваивание наследнику наследника.
    B& B::operator = (const A &right) {
        if (this!=&right) {
            delete prev;
            prev=0;
            x=right.x;
            y=right.y;
        }
     
        return *this;
    }
     
     
    // Операция сложения родителя и наследника.
    B operator + (B left, A right) {
        B res;
        res.x = left.c + right.get_x();
        res.y = left.d + right.get_y();
        res.prev = &left; // Думал, что так решается, но не уверен.
        return res;
    }

    Всего записей: 215 | Зарегистр. 18-06-2009 | Отправлено: 23:01 11-04-2011 | Исправлено: Red Planet, 23:07 11-04-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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