Я пытаюсь инициализировать матрицу классов с помощью функции-члена, такой как thiis
class mat{
int r,c;
float **p;
public:
mat(){}
mat(int,int);
void initialize();
};
mat :: mat (int r, int c){ //check for float and int if error occurs
p=new float*[r];
for(int i=0; i<r; ++i){
p[i]=new float(c);
}
void mat :: initialize(void){
int i,j;
cout<<"\nEnter the elements : ";
for(i=0;i<r;++i){
for(j=0;j<c;++j){
cin>>p[i][j];
}
}
}
int main(){
mat m1(3,3);
cout<<"\nInitialize M1";
m1.initialize();
return(0);
}
но когда я компилирую и запускаю его и пытаюсь инициализировать матрицу, программа никогда не останавливается для получения входных данных. Может ли кто-нибудь сказать мне, что я делаю неправильно?
Куда звонить initialize
?
Я думаю, что ваша ошибка здесь: p[i]=new float(c);
вы хотели выделить один поплавок и установить для него значение c
или выделить c
поплавки?
Пожалуйста, отредактируйте свой вопрос, чтобы показать нам минимально воспроизводимый пример. А также, пожалуйста, сообщите нам, какой вклад вы даете программе.
Кстати, вам не хватает }
в конце вашего конструктора
@drescherjm Правильно, код будет работать, только если c == 1
.
Я думаю, вам также нужно инициализировать r и c в конструкторе
Для ошибки, которую я упомянул, вам нужно изменить p[i]=new float(c);
на p[i]=new float[c];
Вы не инициализируете ни c
, ни r
в своем конструкторе, поэтому, когда вы вызываете initialize
, их значения не определены.
@drescherjm, вы были правы, указав .... я должен был использовать квадратные скобки [ ] вместо ( ) ... это решило мою проблему .... Большое спасибо
@ scohe001 Мне кажется, стрим всегда хорош.
@tibi спасибо, что указали на это..... я тоже это пропустил.
@Rane, спасибо, что указали на это ... я пропустил это ... Большое спасибо!
Вам будет намного проще жить, если вы будете использовать std::vector<std::vector<float>> вместо выделения собственных массивов — гораздо больше работы будет сделано (и правильно) за вас.
Интересно... что послужило причиной выбора "можем ли мы использовать cin>>
в функциях-членах в классе на C++?" как заголовок вместо «можем ли мы использовать вложенные for
в функциях-членах в классе на C++»? (Я предполагаю, что ответ - это какой-то вариант "спешить с выводами - это весело"?) :)
@JaMiT Я не большой программист, поэтому я не знаком с правильными терминами для использования .... но эй! у вас есть точка зрения.
Вам нужно инициализировать r
и c
следующим образом:
mat :: mat (int r, int c) :r(r), c(c){
p=new float*[r];
for(int i=0; i<r; ++i){
p[i]=new float[c];
}
}
и не забудьте добавить деструктор.
Это нормальная и лучшая практика использовать список инициализаторов: mat::mat(int rows, int columns) : r{rows}, c{columns} { ... }
. И правильная терминология - "деструктор", а не "деконструктор".
Похоже, ваш поток плохой. Когда вы отлаживаете, можете ли вы проверить значение
std::cin.good()
?