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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Классы ресурсоёмких объектов 
:(
    Опции темы
Mcicool
Дата 3.11.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Задача:

   Определить класс "набор слов" с закрытыми компонентами: 
число слов и динамический массив с элементами типа string, 
каждый из которых представляет отдельное слово. 
(Слово - последовательность русских или английских букв - 
никаких других символов в слове не должно быть.) 
   Ввести все методы, присущие классу ресурсоемких объектов. 
Предусмотреть конструктор для формирования объекта класса 
на основе строки (string), содержащей некоторый текст. 
Предусмотреть в классе перегрузку операций для ввода-вывода 
(<<, >>) и ,если потребуется, любые средства, необходимые 
для решения основной задачи. 

   В основной программе читать по строкам текстовый файл (имя 
файла ввести с клавиатуры). Для каждой прочитанной строки 
формировать объект класса "набор слов". Анализируя создаваемые 
объекты, вывести объект (набор слов) с максимальным количеством 
слов и последний из объектов, количество слов в котором равно 
заданному с клавиатуры числу. 
PM MAIL   Вверх
Oleg_Ci
Дата 3.11.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

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



Что-то на подобие этого ?
Код

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

class Word
{
private:
    vector<string> line; // динамический массив слов
public:
    Word() {};
    Word( string & str );
    friend istream & operator>>( istream & in, Word & w );
    friend ostream & operator<<( ostream & out, Word & w );
    void erase()        { line.erase(line.begin(), line.end()); }
};
typedef vector<string>::iterator iter;
istream & operator>>( istream & in, Word & w ){
    string temp;
    in >> temp;
    w.line.push_back( temp );
    return in;
}
ostream & operator<<( ostream & out, Word & w ){
    for( iter ptr = w.line.begin(); ptr != w.line.end(); ptr++ )
        out << *ptr << "\n";
    return out;
}

//_________ MAIN_________________
int main(int argc, char *argv[])

    ifstream file("text.txt");
    if( !file.is_open()) return 1;
    Word w;
    while( file >> w );
    cout << w;
    
    getchar();
    return 0;
}

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


Бывалый
*


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

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



Ты не мог бы камменты разместить. Спасибо ))
5 ошибок: 

C:\Documents and Settings\Mcicool\Ðàáî÷èé ñòîë\Cpp\prog2.cpp(22) : error C2248: 'line' : cannot access private member declared in class 'Word'
        C:\Documents and Settings\Mcicool\Ðàáî÷èé ñòîë\Cpp\prog2.cpp(10) : see declaration of 'line'
C:\Documents and Settings\Mcicool\Ðàáî÷èé ñòîë\Cpp\prog2.cpp(26) : error C2248: 'line' : cannot access private member declared in class 'Word'
        C:\Documents and Settings\Mcicool\Ðàáî÷èé ñòîë\Cpp\prog2.cpp(10) : see declaration of 'line'
C:\Documents and Settings\Mcicool\Ðàáî÷èé ñòîë\Cpp\prog2.cpp(26) : error C2248: 'line' : cannot access private member declared in class 'Word'
        C:\Documents and Settings\Mcicool\Ðàáî÷èé ñòîë\Cpp\prog2.cpp(10) : see declaration of 'line'
C:\Documents and Settings\Mcicool\Ðàáî÷èé ñòîë\Cpp\prog2.cpp(37) : error C2593: 'operator >>' is ambiguous
C:\Documents and Settings\Mcicool\Ðàáî÷èé ñòîë\Cpp\prog2.cpp(37) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.
PM MAIL   Вверх
Oleg_Ci
Дата 3.11.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

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



А компилятор какой у вас ?
Я проверял на WS2003 и Borland C++ Builder6, Dev-C++  у меня без ошибок...
Код

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

class Word // класс "набор слов"
{
private:
    vector<string> line; // динамический массив слов
public:
    Word() {}; // конструктор
    Word( string & str ); // конструктор принимающий строку
    friend istream & operator>>( istream & in, Word & w ); // ввод слов из потока
    friend ostream & operator<<( ostream & out, Word & w ); // вывод слов в поток
    void erase()    { line.erase(line.begin(), line.end()); } // удаление всех слов
};
typedef vector<string>::iterator iter; // итератор
istream & operator>>( istream & in, Word & w ){
    string temp;
    in >> temp; // читаем строку в string
    w.line.push_back( temp ); // заносим эту строку в массив
    return in;
}
ostream & operator<<( ostream & out, Word & w ){
    for( iter ptr = w.line.begin(); ptr != w.line.end(); ptr++ )
        out << *ptr << "\n"; // выводим все слова из массива в поток
    return out;
}
Word::Word( string & str ){
    stringstream out;
    out << str;
    string s;
    while( out >> s )
        line.push_back( s );
}
//_________ MAIN_________________
int main(int argc, char *argv[])

    ifstream file("text.txt"); // открываем файл
    if( !file.is_open()) return 1; // если не открылся то выходим из программы
    Word w; // класс - набор слов
    while( file >> w ); // копируем все слова в класс "набор слов"
    cout << w << "\n\n\n"; // выодим все слова из класса "набор слов" на консоль
    
    Word s(string("asd das afa sf sa gs gfdsg dsf")); // новый класс - набор
    cout << s; // вывод нового класса

    getchar(); // пауза
    return 0;
}

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


Бывалый
*


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

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



У меня Visual C++. Пишет те же ошибки.
Кстати, я вот честно не понимаю, чем компиляторы отличаются?

Добавлено @ 23:21 
Кстати. А зачем используется итератор? Я читал, но никак не могу понять, что это по-русски значит.
PM MAIL   Вверх
Oleg_Ci
Дата 6.11.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

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



Насочинял ещё чего-то
Код

// Файл Word.h___________________________________________
#ifndef Word_h
#define Word_h

#include <iostream>
#include <string>
#include <cctype>
using std::string;
using std::istream;
using std::ostream;

typedef string::size_type position;
class Word
{
private:
    string * array; // динамический массив слов
    size_t buffer; // реальное количество выделенной памяти под массив
    size_t count; // количество слов
    string Substr( const string & str, position & pos ) const; // выделение слова из строки
    void add_memory( const size_t size ); // увеличить память

public:
    static size_t add_size; // размер выделяемой памяти за один раз
    static string end_str; // символ разделитель выводимый при выводе слов в поток ("\n")

    Word() : array(NULL), count(0), buffer(0) {}; // кнструктор по умолчанию
    Word( const string & str ); // кoнструктор
    Word( const char * str );
    Word( const Word & w ); // конструктор копирования
    virtual ~Word(); // деструктор

    Word & operator=( const Word &w ); // оператор присвоения
    Word operator+( const Word & w ); // складывание массивов слов
    Word operator+( const string & str ); // прибавление слов тип - string
    Word operator+( const char * str ); // добавление слов тип - char*
    Word & operator+=( const Word & w );
    Word & operator+=( const string & str );
    Word & operator+=( const char * str );
    string & operator[](  const size_t pos )const; // получение слова по индексу

    friend istream & operator>>( istream & in, Word & w ); // чтение слов из потока
    friend ostream & operator<<( ostream & out, const Word & w ); // вывод слов в поток

    /* erase - удаление слов c позиции - begin, количеством - size
    нумерация позиций с нуля ( для begin ),
    если size=1, удаляется один слово из позиции begin
    если size=0, удаляются все слова от begin до конца массива */
    void erase( size_t begin = 0, size_t size = 1 ); // поумолчанию удаляются все слова из массива
    size_t size() { return count; } // количество слов в массиве
    const size_t size()const { return count; }
};

#endif // Word_h
Код

// Файл Word.cpp __________________________________________
#include "Word.h"
#include <string.h>
// для сокращения количества перераспределений памяти add_size увеличить.
size_t Word::add_size = 10; // выделяем память за раз для 10 слов.
string Word::end_str = "\n"; // символ разделитель 
////////// конструктры /////////////////////////////
Word::Word( const string & str ){
    buffer = count = 0;
    array = NULL;
    *this += str;
}
/////////////////////////
Word::Word( const Word & w ){
    buffer = count = 0;
    array = NULL;
    *this = w;
}
////////////////////////
Word::Word( const char * str ){
    buffer = count = 0;
    array = NULL;
    *this += str;
}
////////////////////// деструктор ///////////////
Word::~Word(){
    if( array ) delete [] array;
    buffer = count = 0;
    array = NULL;
}
////////// операторы ///////////////////////////////
Word & Word::operator=( const Word &w ){
    if( this == &w ) return *this;
    this->~Word();
    count = w.count;
    add_memory( count );
    for( size_t i=0; i<count; i++ )
        array[i] = w.array[i];
    return *this;
}
///////////////////////////////////
Word Word::operator+( const string & str ){
    Word w;
    position pos = 0;
    string s;
    while( 1 ){
        s = Substr( str, pos );
        if( pos == string::npos ) break;
        w.count++;
        w.add_memory( w.count );
        w.array[w.count-1] = s;
    }
    return w;
}
//////////////////////////////////
Word Word::operator+( const char * str ){
    return Word::operator +( string(str));
}
/////////////////////////////////
Word & Word::operator+=( const Word & w ){
    size_t x = w.count;
    add_memory( x );
    for( size_t i=0; i<x; i++ ){
        array[count++] = w.array[i];
    }
    return *this;
}
//////////////////////////////////
Word & Word::operator+=( const string & str ){
    position pos = 0;
    string s;
    while( 1 ){
        s = Substr( str, pos );
        if( pos == string::npos ) break;
        count++;
        add_memory( count );
        array[count-1] = s;
    }
    return *this;
}
//////////////////////////////////
Word & Word::operator+=( const char * str ){
    *this += string( str );
    return *this;
}
//////////////////////////////////
Word Word::operator+( const Word & w ){
    Word wd;
    for( size_t i=0; i<w.count; i++ )
        wd = wd + w.array[i];
    return wd;
}
//////////////////////////////////
istream & operator>>( istream & in, Word & w ){
    string str;
    getline( in, str ); // читаем из потока строку
    w += str; // записываем слова в массив
    return in;
}
//////////////////////////////////
ostream & operator<<( ostream & out,const Word & w ){
    for( size_t i=0; i<w.size(); i++ )
        out << w[i] << Word::end_str; // выводим строки в поток с символом разделителем
    return out;
}
////////////////////////////////////
string & Word::operator[](  const size_t pos )const{
    return array[pos]; // возвращаем слово по индексу в массиве
}
/////////// функции ////////////////////////////////////
string Word::Substr( const string & str, position & pos )const{
    position begin = pos; // начало слова
    for(; str[begin] && !isalpha( str[begin] ); begin++ );
    for( pos = begin; str[begin] && isalpha( str[pos] ); pos++ ); // конец слова - pos
    if( pos != begin ) return str.substr( begin, pos-begin );
    pos = string::npos;
    return string();
}
//////////////////////////////////
void Word::add_memory( const size_t size ){
    if ( buffer > count + size )  return; // если буфер памяти не заполнен

    size_t x = buffer; // количество элементов в старом буфере
    buffer += add_size * int( size/add_size +1 ); // увеличиваем буфер
    string * ptr = new string[buffer]; // выделяем новую память

    if( array ){ // если выделяем не в первый раз
        memcpy( ptr, array, x*sizeof(string));    // копируем строки из старого буфера в новый
        delete [] array; // удаляем старый буфер
    }
    array = ptr;
}
///////////////////////////////////
void Word::erase( size_t begin, size_t size ){
    Word w;
    for( size_t i = 0; i < begin && i < count; i++ )
        w += this->array[i];
    for( size_t i = begin + size; i < count; i++ )
        w += this->array[i];
    *this = w;
}
// end class  Word _______________________________
Код

// Файл main.cpp ________________________________________-
#include <iostream>
#include <fstream>
#include "Word.h"
using namespace std;

//_________ MAIN_________________
int main(int argc, char *argv[])

    // проверяем функции класса Word:
    Word w("aaa   bbb"); // конструктор принимающий строку char*
    w += "ccc"; // добавление слова char*
    w += w; // добавление слов из массива слов
    w.erase( 4 ); // удаление слова
    w.erase( 3, 2 ); // удаление двух слов
    cout << w; // вывод слов в поток ( консоль )
    cout << "\n\nEnter string: "; // "Введите слова"
    cin >> w; // ввод слов из потока
    Word::end_str = ", "; // символ разделитель для вывода
    cout << "\n" << w << "\n\n";
    Word::end_str = "\n";
    cout << Word::end_str << w;
    
    // чтение строк из файла
    string str;
    cout << "\n\nEnter filename : ";
    cin >> str;
    ifstream file(str); // открываем файл
    if( !file.is_open()){
        cout << "\n\nError open file...";
        getchar();
        getchar();
        return 1;
    }
    while( !file.eof()){
        file >> w; // считываем слова из файла
    }
    cout << w; // выводим их на косоль
    getchar(); // пауза
    getchar();
    return 0;
}
//________ END MAIN ______________

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


Бывалый
*


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

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



Обалдеть, буду теперь сидеть разбираться. Спасибо!


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


Бывалый
*


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

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



Я так и не смог проверить работоспособность прораммы (
Как это все в один файл засунуть?

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


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

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



Mcicool, смотри внимательней, могут-быть ошибки smile 
Код

/ Файл main.cpp ________________________________________
#include <iostream>
#include <string>
#include <cctype>
#include <fstream>
using namespace std;

typedef string::size_type position;
class Word
{
private:
    
    string * array; // динамический массив слов
    size_t buffer; // реальное количество выделенной памяти под массив
    size_t count; // количество слов
    string Substr( const string & str, position & pos ) const; // выделение слова из строки
    void add_memory( const size_t size ); // увеличить память

public:
    size_t add_size; // размер выделяемой памяти за один раз
    string end_str; // символ разделитель выводимый при выводе слов в поток ("\n")

    Word() : array(NULL), count(0), buffer(0), add_size(10), end_str("\n") {}; // кнструктор по умолчанию
    Word( const string & str ); // кoнструктор
    Word( const char * str );
    Word( const Word & w ); // конструктор копирования
    virtual ~Word(); // деструктор

    Word & operator=( const Word &w ); // оператор присвоения
    Word operator+( const Word & w ); // складывание массивов слов
    Word operator+( const string & str ); // прибавление слов тип - string
    Word operator+( const char * str ); // добавление слов тип - char*
    Word & operator+=( const Word & w );
    Word & operator+=( const string & str );
    Word & operator+=( const char * str );
    string & operator[](  const size_t pos )const; // получение слова по индексу

    friend istream & operator>>( istream & in, Word & w ); // чтение слов из потока
    friend ostream & operator<<( ostream & out, const Word & w ); // вывод слов в поток

    /* erase - удаление слов c позиции - begin, количеством - size
    нумерация позиций с нуля ( для begin ),
    если size=1, удаляется один слово из позиции begin
    если size=0, удаляются все слова от begin до конца массива */
    void erase( size_t begin = 0, size_t size = 1 ); // поумолчанию удаляются все слова из массива
    size_t size() { return count; } // количество слов в массиве
    const size_t size()const { return count; }
};


////////// конструктры /////////////////////////////
Word::Word( const string & str ){
    // для сокращения количества перераспределений памяти add_size увеличить.
    add_size = 10; // выделяем память за раз для 10 слов.
    end_str = "\n"; // символ разделитель 
    buffer = count = 0;
    array = NULL;
    *this += str;
}
/////////////////////////
Word::Word( const Word & w ){
    add_size = 10;
    end_str = "\n";
    buffer = count = 0;
    array = NULL;
    *this = w;
}
////////////////////////
Word::Word( const char * str ){
    add_size = 10;
    end_str = "\n";
    buffer = count = 0;
    array = NULL;
    *this += str;
}
////////////////////// деструктор ///////////////
Word::~Word(){
    if( array ) delete [] array;
    buffer = count = 0;
    array = NULL;
}
////////// операторы ///////////////////////////////
Word & Word::operator=( const Word &w ){
    if( this == &w ) return *this;
    this->~Word();
    count = w.count;
    add_memory( count );
    for( size_t i=0; i<count; i++ )
        array[i] = w.array[i];
    return *this;
}
///////////////////////////////////
Word Word::operator+( const string & str ){
    Word w;
    position pos = 0;
    string s;
    while( 1 ){
        s = Substr( str, pos );
        if( pos == string::npos ) break;
        w.count++;
        w.add_memory( w.count );
        w.array[w.count-1] = s;
    }
    return w;
}
//////////////////////////////////
Word Word::operator+( const char * str ){
    return Word::operator +( string(str));
}
/////////////////////////////////
Word & Word::operator+=( const Word & w ){
    size_t x = w.count;
    add_memory( x );
    for( size_t i=0; i<x; i++ ){
        array[count++] = w.array[i];
    }
    return *this;
}
//////////////////////////////////
Word & Word::operator+=( const string & str ){
    position pos = 0;
    string s;
    while( 1 ){
        s = Substr( str, pos );
        if( pos == string::npos ) break;
        count++;
        add_memory( count );
        array[count-1] = s;
    }
    return *this;
}
//////////////////////////////////
Word & Word::operator+=( const char * str ){
    *this += string( str );
    return *this;
}
//////////////////////////////////
Word Word::operator+( const Word & w ){
    Word wd;
    for( size_t i=0; i<w.count; i++ )
        wd = wd + w.array[i];
    return wd;
}
//////////////////////////////////
istream & operator>>( istream & in, Word & w ){
    string str;
    getline( in, str ); // читаем из потока строку
    w += str; // записываем слова в массив
    return in;
}
//////////////////////////////////
ostream & operator<<( ostream & out,const Word & w ){
    for( size_t i=0; i<w.size(); i++ )
        out << w[i] << w.end_str; // выводим строки в поток с символом разделителем
    return out;
}
////////////////////////////////////
string & Word::operator[](  const size_t pos )const{
    return array[pos]; // возвращаем слово по индексу в массиве
}
/////////// функции ////////////////////////////////////
string Word::Substr( const string & str, position & pos )const{
    position begin = pos; // начало слова
    for(; str[begin] && !isalpha( str[begin] ); begin++ );
    for( pos = begin; str[begin] && isalpha( str[pos] ); pos++ ); // конец слова - pos
    if( pos != begin ) return str.substr( begin, pos-begin );
    pos = string::npos;
    return string();
}
//////////////////////////////////
void Word::add_memory( const size_t size ){
    if ( buffer > count + size )  return; // если буфер памяти не заполнен

    size_t x = buffer; // количество элементов в старом буфере
    buffer += add_size * int( size/add_size +1 ); // увеличиваем буфер
    string * ptr = new string[buffer]; // выделяем новую память

    if( array ){ // если выделяем не в первый раз
        memcpy( ptr, array, x*sizeof(string));    // копируем строки из старого буфера в новый
        delete [] array; // удаляем старый буфер
    }
    array = ptr;
}
///////////////////////////////////
void Word::erase( size_t begin, size_t size ){
    Word w;
    for( size_t i = 0; i < begin && i < count; i++ )
        w += this->array[i];
    for( size_t i = begin + size; i < count; i++ )
        w += this->array[i];
    *this = w;
}
///////////////////////////////////////////
//_________ MAIN_________________
int main(int argc, char *argv[])

    // проверяем функции класса Word:
    Word w("aaa   bbb"); // конструктор принимающий строку char*
    w += "ccc"; // добавление слова char*
    w += w; // добавление слов из массива слов
    w.erase( 4 ); // удаление слова
    w.erase( 3, 2 ); // удаление двух слов
    cout << w; // вывод слов в поток ( консоль )
    cout << "\n\nEnter string: "; // "Введите слова"
    cin >> w; // ввод слов из потока
    w.end_str = ", "; // символ разделитель для вывода
    cout << "\n" << w << "\n\n";
    w.end_str = "\n";
    cout << w.end_str << w;
    
    // чтение строк из файла
    string str;
    cout << "\n\nEnter filename : ";
    cin >> str;
    ifstream file;
    file.open( str.c_str());// открываем файл
    if( !file.is_open()){
        cout << "\n\nError open file...";
        getchar();
        getchar();
        return 1;
    }
    while( !file.eof()){
        file >> w; // считываем слова из файла
    }
    cout << w; // выводим их на косоль
    getchar(); // пауза
    getchar();
    return 0;
}

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


Бывалый
*


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

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



14 ошибок )))
error C2143: syntax error : missing ';' before '/'
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(1) : error C2018: unknown character '0xd4'
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(1) : error C2018: unknown character '0xe0'
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(1) : error C2018: unknown character '0xe9'
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(1) : error C2018: unknown character '0xeb'
c:\program files\microsoft visual studio\vc98\include\errno.h(29) : error C2143: syntax error : missing ';' before '{'
c:\program files\microsoft visual studio\vc98\include\errno.h(29) : error C2447: missing function header (old-style formal list?)
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(189) : error C2374: 'i' : redefinition; multiple initialization
        c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(187) : see declaration of 'i'
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(203) : error C2593: 'operator <<' is ambiguous
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(205) : error C2593: 'operator >>' is ambiguous
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(207) : error C2593: 'operator <<' is ambiguous
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(209) : error C2593: 'operator <<' is ambiguous
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(224) : error C2593: 'operator >>' is ambiguous
c:\documents and settings\mcicool\ðàáî÷èé ñòîë\cpp\prog8\main.cpp(226) : error C2593: 'operator <<' is ambiguous
Error executing cl.exe.

main.obj - 14 error(s), 0 warning(s)

PM MAIL   Вверх
Oleg_Ci
Дата 8.11.2006, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

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



Ну тогда я тебе не помогу...
Может только подключаемые файлы изменить попробывать
Код

#include <iostream.h>
...

PM MAIL   Вверх
Mcicool
Дата 8.11.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А ты сам проверял? У тебя работает?
Че она вообще делает ?  smile 
PM MAIL   Вверх
Oleg_Ci
Дата 8.11.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

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



Ну конечно всё работает smile 
Вот урезал много чего, чтобы попроще было...
Только теперь память для динамического массива выделяется не эффективно, при добавлении нового слова, программа снова выделяет память и копирует туда строки, и так при каждом добавлении слова, снова выделяет и копирует, и т.д...
Цитата(Mcicool @  8.11.2006,  17:36 Найти цитируемый пост)
Че она вообще делает ?

ну ведь прокоментировал немного, вроде должно понятно быть.
Есть класс который содержит массив слов.
Умеет добавлять слова из строк char*, string, и из себе подобных массивов.
Умеет читать слова с консоли и из файла, и тудаже записывать.
Удалять слова тоже умеет.
Кстати работает только в DOS кодировке... т.е. с русскими буквами написанными в windows проблемы будут.

 smile Прога версия№ 3 :
Код

#include <iostream>
#include <string>
#include <cctype>
#include <fstream>
using namespace std;


class Word{
private:

    typedef string::size_type position;
    string * array; // динамический массив слов
    size_t count; // количество слов
    string Substr( const string & str, position & pos ) const; // выделение слова из строки
    void add_memory( const size_t size = 1 ); // увеличить память ( по умолчанию на 1 сторку )
    void _null(); // "обнулятор"

public:
    string end_str; // символ разделитель выводимый при выводе слов в поток ("\n")

    Word() : array(NULL), count(0), end_str("\n") {}; // кнструктор по умолчанию
    Word( const string & str ); // кoнструктор
    Word( const char * str );
    Word( const Word & w ); // конструктор копирования
    virtual ~Word(); // деструктор

    Word & operator=( const Word &w ); // оператор присвоения
    Word & operator+=( const Word & w );
    Word & operator+=( const string & str );
    Word & operator+=( const char * str );
    string & operator[](  const size_t pos )const; // получение слова по индексу

    friend istream & operator>>( istream & in, Word & w ); // чтение слов из потока
    friend ostream & operator<<( ostream & out, const Word & w ); // вывод слов в поток

    /* erase - удаление слов c позиции - begin, количеством - size
    нумерация позиций с нуля ( для begin ),
    если size=1, удаляется один слово из позиции begin
    если size=0, удаляются все слова от begin до конца массива */
    void erase( size_t begin = 0, size_t size = 1 ); // поумолчанию удаляются все слова из массива
    const size_t size()const { return count; }// количество слов в массиве
};


////////// конструктры /////////////////////////////
Word::Word( const string & str ){
    _null();
    *this += str;
}
/////////////////////////
Word::Word( const Word & w ){
    _null();
    *this = w;
}
////////////////////////
Word::Word( const char * str ){
    _null();
    *this += str;
}
////////////////////// деструктор ///////////////
Word::~Word(){
    if( array ) delete [] array;
    _null();
}
////////// операторы ///////////////////////////////
Word & Word::operator=( const Word &w ){
    if( this == &w ) return *this;
    this->~Word();
    add_memory( w.count );
    for( size_t i=0; i<count; i++ )
        array[i] = w.array[i];
    return *this;
}
/////////////////////////////////
Word & Word::operator+=( const Word & w ){
    size_t x = w.count;
    add_memory( x );
    for( size_t i=0; i<x; i++ ){
        array[count -x ] = w.array[i];
    }
    return *this;
}
//////////////////////////////////
Word & Word::operator+=( const string & str ){
    position pos = 0;
    string s;
    while( 1 ){
        s = Substr( str, pos );
        if( pos == string::npos ) break;
        add_memory();
        array[count-1] = s;
    }
    return *this;
}
//////////////////////////////////
Word & Word::operator+=( const char * str ){
    return *this += string( str );
}
//////////////////////////////////
istream & operator>>( istream & in, Word & w ){
    string str;
    getline( in, str ); // читаем из потока строку
    w += str; // записываем слова в массив
    return in;
}
//////////////////////////////////
ostream & operator<<( ostream & out,const Word & w ){
    for( size_t i=0; i<w.size(); i++ )
        out << w[i] << w.end_str; // выводим строки в поток с символом разделителем
    return out;
}
////////////////////////////////////
string & Word::operator[](  const size_t pos )const{
    return array[pos]; // возвращаем слово по индексу в массиве
}
/////////// функции ////////////////////////////////////
string Word::Substr( const string & str, position & pos )const{
    position begin = pos; // начало слова
    for(; str[begin] && !isalpha( str[begin] ); begin++ );
    for( pos = begin; str[begin] && isalpha( str[pos] ); pos++ ); // конец слова - pos
    if( pos != begin ) return str.substr( begin, pos-begin );
    pos = string::npos;
    return string();
}
//////////////////////////////////
void Word::add_memory( const size_t size ){
    count += size;
    string * ptr = new string[count]; // выделяем новую память

    if( array ){ // если выделяем не в первый раз
        for( int i=0; i<count-size; i++ )
            ptr[i] = array[i];
        delete [] array; // удаляем старую память
    }
    array = ptr;
}
///////////////////////////////////
void Word::erase( size_t begin, size_t size ){
    Word w;
    for( size_t i = 0; i < begin && i < count; i++ )
        w += this->array[i];
    for( size_t i = begin + size; i < count; i++ )
        w += this->array[i];
    *this = w;
}
///////////////////////////////////////////
void Word::_null(){
    end_str = "\n";
    count = 0;
    array = NULL;
}
//_________ MAIN_________________
int main(int argc, char *argv[])

    // проверяем функции класса Word:
    Word w("aaa   bbb"); // конструктор принимающий строку char*
    w += "ccc"; // добавление слова char*
    w += w; // добавление слов из массива слов
    w.erase( 4 ); // удаление слова
    w.erase( 3, 2 ); // удаление двух слов
    cout << w; // вывод слов в поток ( консоль )
    cout << "\n\nEnter string: "; // "Введите слова"
    cin >> w; // ввод слов из потока
    w.end_str = ", "; // символ разделитель для вывода
    cout << "\n" << w << "\n\n";
    w.end_str = "\n";
    cout << w.end_str << w;
    fflush( stdin );

    
    // чтение строк из файла
    string str;
    cout << "\n\nEnter filename : ";
    cin >> str;
    ifstream file;
    file.open( str.c_str());// открываем файл
    if( !file.is_open()){
        cout << "\n\nError open file...";
        getchar();
        getchar();
        return 1;
    }
    while( !file.eof()){
        file >> w; // считываем слова из файла
    }
    cout << w; // выводим их на косоль
    getchar(); // пауза
    getchar();
    return 0;
}

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


Бывалый
*


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

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



error C2593: 'operator <<' is ambiguous
error C2593: 'operator >>' is ambiguous
Все 6 ошибок одинаковые, только в разных строчках, и позоду все в функции main() .

Это сообщение отредактировал(а) Mcicool - 9.11.2006, 17:55
PM MAIL   Вверх
Mcicool
Дата 9.11.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Еще вопрос такой: Зачем Вы используете виртуальный деструктор??
Что такое вообще virtual ??
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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