Форум программистов, компьютерный форум CyberForum.ru

присвоить заведомо не зная - C++

Восстановить пароль Регистрация
 
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
03.04.2013, 11:06     присвоить заведомо не зная #1
ох. Задача из ряда невыполнимых для мозга.
Есть класс, например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Class1
{
     Class1(string fileName)
     {
           //открываем файл и считаем строки
          int count; //в переменной кол-во строк 
 
          /*и только теперь узнав колличество строк
          я могу создать массив*/
 
          float _mass[count][2];
          //заполню его
          
          /* Как теперь его поместить в переменную mass??? как
          сделать этот массив членом класса?*/  
          //пробовал так, не вышло
          mass = &_mass;  
     }
private:
    float *mass; 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.04.2013, 11:09     присвоить заведомо не зная #2
Весь код чуть более чем полностью неправильный.

Сделай mass указателем на указатель и выделяй под него память в конструкторе. Ну и сразу же заполняй. Только в деструкторе освободить память не забудь.
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
03.04.2013, 11:14  [ТС]     присвоить заведомо не зная #3
Kastaneda, вся проблема в том что я не могу создать массив mass в классе сразу, потому что не знаю кол-во его элементов.

Добавлено через 2 минуты
так тоже не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Class1
{
     Class1(string fileName)
     {
           //открываем файл и считаем строки
          int count; //в переменной кол-во строк 
 
          /*и только теперь узнав колличество строк
          я могу создать массив*/
 
          mass = new float[count][2];
          //заполню его
 
     }
private:
    float **mass; 
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 11:17     присвоить заведомо не зная #4
Цитата Сообщение от No10 Посмотреть сообщение
вся проблема в том что я не могу создать массив mass в классе сразу, потому что не знаю кол-во его элементов.
Используете std::string?
Тогда уж и std::vector можно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.04.2013, 11:20     присвоить заведомо не зная #5
Цитата Сообщение от No10 Посмотреть сообщение
C++
1
mass = new float[count][2];
вот так надо
C++
1
2
3
4
5
mass = new float*[count];
const int magicTwo = 2;
for (int i = 0; i < magicTwo; i++) {
    mass[i] = new float[magicTwo];
}
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
03.04.2013, 11:34  [ТС]     присвоить заведомо не зная #6
Croessmah, нет использую QString, а string написал для примера
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 11:37     присвоить заведомо не зная #7
QVector Class Reference
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
03.04.2013, 11:42  [ТС]     присвоить заведомо не зная #8
Croessmah, я не могу использовать QVector, про контейнеры наслышан, но в данном контексте не подойдёт, потому что потом нужно работать только с массивом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2013, 12:27     присвоить заведомо не зная
Еще ссылки по теме:

C++ Как сравнить char*, зная длинну?
C++ Ввод массива не зная размера
C++ Считать матрицу с файла, не зная ее размерности

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 12:27     присвоить заведомо не зная #9
Тогда вручную перераспределяйте память...
C++
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
#include <iostream> 
#include <string>
#include <fstream>
 
class Class1{
public:
    Class1(const std::string fileName):mass(NULL),size(0){
        std::ifstream ifile(fileName);
        int count=0;
        int capacity=10;
        temp_resize(mass,0,capacity);
        if(!ifile.is_open())
            return;
        while(!ifile.eof()){
            if(count==capacity)
                capacity=temp_resize(mass,capacity,capacity+10);
            ifile>>mass[count][0]>>mass[count][1];
            ++count;
        }
        size=temp_resize(mass,capacity,count);
    }
    ~Class1(){
        for(int i=0;i<size;++i)
            delete [] mass[i];
        delete [] mass;
    }
    void print(std::ostream & os){
        for(int i=0;i<size;++i){
            os<<mass[i][0]<<" "<<mass[i][1]<<std::endl;
        }
    }
private:
    int temp_resize(float ** & arr,const int oldsize,const int newsize){
        if(oldsize==newsize)
            return newsize;
        if(!arr){
            arr=new float*[newsize];
            for(int i=0;i<newsize;++i)
                arr[i]=new float[2];
            return newsize;
        }
        float ** p=new float*[newsize];
        if(oldsize<newsize){
            for(int i=0;i<oldsize;++i)
                p[i]=arr[i];
            for(int i=oldsize;i<newsize;++i)
                p[i]=new float[2];
            delete [] arr;
            arr=p;
        }else{
            for(int i=0;i<newsize;++i)
                p[i]=arr[i];
            for(int i=newsize;i<oldsize;++i)
                delete [] arr[i];
            delete [] arr;
            arr=p;
        }
        return newsize;
    }
    float **mass;
    int size;
};
 
int main(){
    Class1 cls(std::string("c:\\cpp\\2.txt"));
    cls.print(std::cout);
    std::cout<<std::endl;
}
присвоить заведомо не зная
Yandex
Объявления
03.04.2013, 12:27     присвоить заведомо не зная
Ответ Создать тему
Опции темы

Текущее время: 17:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru