Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Garrett
Дата сообщения: 29.03.2011 18:36
Red Planet
Почему Вы не закрываете файл "res.txt"?

А почему просто не написать
ofstream to_res ("res.txt");
Автор: Red Planet
Дата сообщения: 29.03.2011 19:14
Garrett, получилось с использованием

Цитата:
ofstream to_res ("res.txt");
Автор: modwind
Дата сообщения: 02.04.2011 16:26

Цитата:
Решил создать multimap <int, string, comp>

Red Planet, это ужасно. Чем обычный вектор не подходит?

Код:
#include <stdio.h>
#include <vector>
#include <algorithm>

struct letter
{
char s;
int count;
};

bool sort_function (const letter& i,const letter& j) { return (i.count>j.count);}

int main()
{
std::vector<letter> list;
std::sort (list.begin(), list.end(),sort_function);
}
Автор: Red Planet
Дата сообщения: 03.04.2011 10:59
modwind, попробую позже.

Есть еще вопрос. Насколько я знаю, дружественные функции не наследуются. Но почему тогда работает код? Почему объект класса Y успешно выводится?


Цитата:
// ---------------------------------------------------------------------------
#include <vcl>
#include <iostream>
#pragma hdrstop

using namespace std;

class X {
    protected: int c, d;
    public: X () {c=1; d=1;}
    friend ostream& operator << (ostream &s, const X &t) {
        s <<"("<<t.c<<", "<<t.d<<")."<<endl;
        return s;
    }
};


class Y:public X {
    public: Y () {c+=2; d+=2;}
};


int _tmain (int argc, _TCHAR* argv[]) {
    X x1;
    Y y1;
    cout <<x1<<y1<<endl;
    system ("pause");
    return 0;
}
Автор: Qraizer
Дата сообщения: 03.04.2011 23:47
Выводится объект класса X. Объект класса Y не может быть выведен, т.к. не определяет operator<<(), зато ссылка на него может быть откастована к константной ссылке на публичный базовый Х.
Автор: Red Planet
Дата сообщения: 04.04.2011 23:37
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;
}



Ведь защищенные члены базового становятся при публичном наследовании защищенными членами производного. Что здесь не так?
Автор: Abs62
Дата сообщения: 04.04.2011 23:57
Red Planet
Производный класс имеет доступ к защищённым членам объектов только собственного типа. К защищённым членам объектов других типов у него доступа нет. Так что Y::operator = может обращаться к c, но не к right.c, так как right - объект класса X.
Автор: Qraizer
Дата сообщения: 05.04.2011 01:44

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


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


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

Автор: Abs62
Дата сообщения: 05.04.2011 07:55
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;
}
Автор: Red Planet
Дата сообщения: 05.04.2011 19:32
Abs62, нужно

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


Иначе ошибка

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


Автор: Qraizer
Дата сообщения: 06.04.2011 01:57
Red Planet, заметь, operator<<()-у терерь совсем необязательно быть другом.
Автор: V0lt
Дата сообщения: 09.04.2011 11:28
удалено
Автор: DenisM300
Дата сообщения: 09.04.2011 20:23
пишу программу в Dev-C++ для работы с бинарными деревьями.
возникла такая проблема: функция FindTree возвращает отрицательное значение, т.е. она считает, что дерево пустое и возвращает -1 до тех пор, пока не будет достигнут конец файла при считывании элементов, которые надо найти.
в чем причина, и как ее исправить?

[more=Код программы]
Код: #include <iostream>
#include <iomanip>
#include <fstream>
#include <conio.h>

using namespace std;

ifstream in_file("input.txt");
ofstream out_file("output.txt");

int kol = 0;
char find_word[64];

struct tree
{
string sl;
tree *left;
tree *right;
};

typedef tree* derevo;

void AddTree(derevo &t, string w)
{
if (t == NULL)
{
t = new tree;
t->left = NULL;
t->right = NULL;
t->sl = w;
}
else
{
if (w >= t->sl)
AddTree(t->right, w);
if (w < t->sl)
AddTree(t->left, w);
}
}

void OutTree(derevo t, int level=1)
{
int tab = 5;
if (t == NULL)
out_file << "Пустое дерево\n";
else
{
if (t->right != NULL)
OutTree(t->right, level + 1);
out_file << setw(tab*level) << t->sl << endl;
if (t->left != NULL)
OutTree(t->left, level + 1);
}
}

int FindTree(char find_word[64], derevo *t)
{
if (*t == NULL)
kol = -1;
else
{
in_file >> find_word;
if ((**t).sl == find_word)
kol = 1;
else
{
if (find_word < (**t).sl)
{
FindTree(find_word, &((**t).left));
kol++;
}
else
if (find_word > (**t).sl)
{
FindTree(find_word, &((**t).right));
kol++;
}
}
}
return kol;
}

void DeleteTree(derevo &t)
{
if (t)
{
DeleteTree(t->left);
DeleteTree(t->right);
delete t;
t = NULL;
}
}

int main()
{
setlocale(LC_ALL,"Russian");
nazad:
printf("Выберите действие: \n 1 - Выполнение программы \n 2 - Вывод количества шагов поиска элемента \n 0 - Выход \nНомер действия: ");
cin >> arg;
if (arg == 1 or arg == 2 or arg == 0)
{
if (arg == 1)
{
system("cls");
derevo tl, t;
int n;
string e;
t = NULL;
while (in_file >> e)
AddTree(t, e);
OutTree(t);
system("pause");
in_file.close();
goto nazad;

}
if (arg == 2)
{
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);
}
if (z == -1)
cout << "Пустое дерево\n";
else
cout << "\nКоличество сравнений: " << z << endl;
cout << endl << endl;
system("pause");
system("cls");
goto nazad;
}
if (arg == 0)
{
derevo t;
DeleteTree(t);
return 0;
}
}
else
{
printf("\n !Неверный аргумент! \n");
cin.clear();
_flushall();
goto nazad;
}
system("PAUSE");
return 0;
}
Автор: xzGORzx
Дата сообщения: 10.04.2011 00:01
Здравствуйте!
Такая проблема:
Пытаюсь в среде Visual c++ получить pid процесса. таким-же способом как получал его в Dev c++, а именно:

Код:
HWND hWnd = FindWindow(0,"WindowName");
DWORD pid;
GetWindowThreadProcessId(hWnd, &pid);
Автор: vlary
Дата сообщения: 10.04.2011 00:31
xzGORzx FindWindowA находится в библиотеке user32.lib, нужно дать ссылку для линковки.
Вместо "WindowName" используй L"WindowName"
Автор: Qraizer
Дата сообщения: 10.04.2011 00:31
Ты пыташься собрать юникодное приложение. Просто смени тип проекта на ANSI, или используй юникодные строки:
Код: FindWindow(0, L"WindowName");
Автор: xzGORzx
Дата сообщения: 10.04.2011 08:12
Тоже пробовал так сделать. Вываливает это:

Код:
Ошибка    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
Автор: ValidolX
Дата сообщения: 10.04.2011 10:54
DenisM300
что за программа такая? что за слова "or" в коде?

2) почему нету начального состаояния переменной дерева7
вот так никуда ни годиться
derevo tl, t;
надо derevo tl = NULL, t = NULL;

как найти ошибку - постройте релиз и сразу будет гав
Автор: KChernov
Дата сообщения: 10.04.2011 11:11
ValidolX
Ну при таком коде - скорее всего его ещё ни разу не пробовали компилировать.
И тем более странно, что задаётся вопрос почему не работает правильно.
Конечно работать с Dev-C++ не приходилось - мб там есть какие особенности?..
Автор: DenisM300
Дата сообщения: 11.04.2011 14:20
ну если бы я ни разу не пробовал компилировать, то откуда бы я мог знать, что функция поиска возвращает отрицательные значения?
Автор: KChernov
Дата сообщения: 11.04.2011 15:47
DenisM300

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

Ну мало ли. Может препод сказал.

У меня ваш код вообще не компилируется.
Может конечно стандарт С из Dev-C++ так сильно отличается от стандарта С VS2008 (вообще конечно МС зачастую грешит некоторыми отступлениями от стандарта).
А может вы выложили не тот код.
Как минимум or в С - это что-то новое.
Автор: kotlomoy
Дата сообщения: 11.04.2011 19:22
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);
}
Автор: DenisM300
Дата сообщения: 11.04.2011 21:29

Цитата:
Ну мало ли. Может препод сказал.

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

это не С, а С++
а VS действительно отличается... сталкивался.

2 kotlomoy
подскажите, как исправить? у меня еще не хватает познаний в программировании, чтоб писать без ошибок
Автор: Red Planet
Дата сообщения: 11.04.2011 22:01
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения "знал" операнда-наследника (для того и сделан в нем указатель 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;
}
Автор: kotlomoy
Дата сообщения: 11.04.2011 22:38
DenisM300
Даже не знаю с чего начать...
1. Вот почему вы в каждом if'е объявляете новую переменную t? Эта новая переменная ничего не содержит, что вы в ней пытаетесь искать? Разве вам не та t нужна, которую вы в первом условии заполняли? Соответсвенно на все три условия должна быть одна переменная t.
2. Вы знаете, что такое указатель? Когда вы пишите derevo t, никакое дерево вы не создаете, а лишь объявляете указатель. По этому указателю ничего писать нельзя, т.к. у вас он никуда не указывает. А чтобы создать дерево, нужно писать tree t.
Автор: KChernov
Дата сообщения: 12.04.2011 00:59
DenisM300

Цитата:
это не С, а С++

Ну если уж придираться к деталям, то это вообще сборная солянка (тот же вывод и в стиле С, и в С++). А поскольку ООП явно не используется, то это скорее С--.
Автор: KChernov
Дата сообщения: 12.04.2011 08:21
DenisM300
Специально поставил Dev-C++.
Ваш код всё ещё не компилируется.
Продолжаете настаивать на своей версии?
Автор: DenisM300
Дата сообщения: 12.04.2011 10:02

Цитата:
DenisM300
Специально поставил Dev-C++.
Ваш код всё ещё не компилируется.
Продолжаете настаивать на своей версии?

http://img830.imageshack.us/i/88832671.jpg/
Автор: Qraizer
Дата сообщения: 12.04.2011 23:59
Отсутствуют по меньшей мере 4 заголовочных файла и определение одной переменной. Если компилируется, крупно повезло. Ничего не трогай, так сдавай.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.