Проблема с функцией друга
Поэтому моя программа состоит в том, что я хочу, чтобы пользователь вводил информацию о доске, чтобы все работало, кроме той части, где мне нужно, чтобы пользователь ввел значение отношения, затем добавьте еще одно число, чтобы увеличить это отношение, поэтому я застрял в этом. Как видите, я объявил эту функцию как друга, но когда я ввожу число, которое мне нужно, чтобы увеличить его до значения отношения), оно остается прежним! Надеюсь, я прояснил проблему, с которой я столкнулся! и я был бы признателен за помощь
#ifndef BOARD_H
#define BOARD_H
class Board {
friend void incAttitude(Board &);
public:
friend void incAttitude(Board &);
static int boardcount;
Board(int=5,int=3,double=1.5,char* ='\0');
~Board();
Board &setBoard(int,int,double,char*);
char getLocation();
Board &print();
double surface();
private:
const int length;
int width;
double attitude;
char location[30];
};
#endif
#include<iostream>
#include<cstring>
#include<string>
#include<assert.h>
using namespace std;
#include "Board.h"
int Board::boardcount=0;
Board::Board(int l,int w,double a,char* lo)
: length(l)
{
width=w;
attitude=a;
location[0]='\0';
boardcount++;
}
Board::~Board(){
boardcount--;
}
Board &Board::setBoard(int l,int w,double a,char* lo)
{
width=(w>=2 && w<=5)?w:3;
attitude=(a>=1.5 && a<=2.8)?a:1.5;
strncpy_s(location,lo,29);
location[29]='\0';
return *this;
}
char Board::getLocation(){
return *location;
}
double Board::surface(){
return length*width;
}
void incAttitude(Board &h)
{
double incAttitude;
cout<<"enter to increase attitude "<<endl;
cin>>incAttitude;
h.attitude+=incAttitude;
cout<<"the attitude of the board after the increase : "<<h.attitude<<endl;
}
Board &Board::print(){
cout<<"the length of the boarad : "<<length<<endl;
cout<<"the width of the board : "<<width<<endl;
cout<<"the height of the board : "<<attitude<<endl;
cout<<"the location of the board : "<<location<<endl;
cout<<"the surface of the board : "<<surface()<<endl;
return *this;
}
int main(){
Board hh;
Board *boardptr;
int count,len,wid;
double att;
char locat[30];
cout<<"how many boards do you need to create ? "<<endl;
cin>>count;
boardptr = new Board[count];
assert(boardptr!=0);
for (int i=0; i<count; i++){
cout << "Enter the length: ";
cin >>len;
cout << "Enter the width: ";
cin >> wid;
cout << "Enter the attitude: ";
cin >> att;
incAttitude(hh);
cout<<"Enter the location: ";
cin >>locat;
boardptr[i].setBoard(len,wid,att,locat);
cout<<"------------------------------------------"<<endl;
if (strcmp("NewYork",locat) == 0)
{
boardptr[i].setBoard(len,wid,att,locat).print();
}
}
delete [] boardptr;
system("pause");
return 0;
}
1 ответ
У вас есть массив Board
с, который называется boardptr
, Но что тогда hh
? Одна доска. Что оно делает? Ничего такого! Но вы используете его в incAttitude(hh);
! Это увеличивает высоту, но не на доске boardptr[i]
(что вы используете), скорее на hh
,
Во-вторых, вы никогда не устанавливаете att
, что означает, что высота всегда 1.5
(это значение по умолчанию). Так incAttitude
добавляет номер к 1.5
, Вы могли бы пройти att
в incAttitude
например.
Тогда, если ваше условие сравнения, почему вы снова устанавливаете плату? Сбрасывает каждое значение, выбранное пользователем. Вам не нужно, потому что вы уже звоните
setBoard
несколько строк рано. Данные, которые вы устанавливаете с setBoard
сохраняется в этом массиве, поэтому вам не нужно переопределять данные точно такими же данными. Просто используйте boardptr[i].print()
, массивы символов,
strcmp
, необработанные указатели и массивы фиксированного размера взяты из C, вы должны рассмотреть альтернативы:- Символьные массивы ->
std::string
strcmp
->if (str == "foo")
- Необработанные указатели -> Умные указатели (или в вашем случае (потому что они используются в качестве массивов)
std::array
или жеstd::vector
-std::vector
для динамических массивов размеров) - Массивы фиксированного размера ->
std::array