私は、次の属性を持つワイナリーのさまざまな属性を追跡するプログラムを作成しようとしています。今年のワイナリーを追跡するオブジェクト内で整数と浮動小数点を正しく使用するにはどうすればよいですか?
-Dynamically割り当てられたメモリ
-Integersはブドウ畑が取る成功の評価と土地のエーカーのため
-Floatsを開始しました。
- ワイナリーデータの追加、削除、(評価と名前による)表示、保存を行う機能。
私はすでにすべての属性がcstringであった同様のプログラムで動作するコードを作成してデバッグしましたが、このコードは同じフレームワークに基づいています。
私の問題は、動的に割り当てられたcstringsで動作する同じコードが整数または浮動小数点では機能せず、コンパイラから変換エラーメッセージが出ることです。私はlist
クラスを持っています。aWinery
が含まれています。プライベートメンバーを使ってデータを隠すので、クライアントプログラムからlist
とaWinery
に渡す関数があります。同じ型の関数は同じですので、ここにはそれぞれの型の関数しか含まれていません。
誰かが間違っていることを指摘できますか? aWinery
のintとfloatの定義がポインタでない場合、どのようにパラメータを返すのか分かりません。私がクラスで見つけることができるダイナミックメモリプログラミングの唯一の例はcstringsを使用しています。私はそれを理解することができなかったので、私はインストラクターからコピーしたコードの2つのポイントに注目しました。
編集:私が得ている具体的なエラーはinvalid conversion from int* to int\n year = this->year
です。aWinery
の整数と浮動小数点型のアクセッサ関数とミューテータ関数のすべてで何らかの置換が行われています。
リストアクセッサ、ミューテータ、コンストラクタ、デストラクタ関数
void list::getWineryLocation(char location[]) const
{
wineryData.getLocation(location);
}
void list::getWineryYear(int year) const
{
wineryData.getYear(year);
}
void list::getWineryAcres(float acres) const
{
wineryData.getAcres(acres);
}
void list::setWineryLocation(char location[])
{
wineryData.setLocation(location);
}
void list::setWineryYear(int year)
{
wineryData.setYear(year);
}
void list::setWineryAcres(float acres)
{
wineryData.setAcres(acres);
}
//Constructor functions
list::list()
{
nameHead = NULL;
nameTail = NULL;
ratingHead = NULL;
ratingTail = NULL;
size = 0;
}
//Destructor
//Doesn't delete the head/tailRating pointers to avoid double deleting a winery
list::~list()
{
node * curr = nameHead;
while (nameHead != NULL)
{
curr = nameHead->nextByName;
delete nameHead;
nameHead = curr;
}
}
aWineryアクセッサ、ミューテータ、コンストラクタ、デストラクタ関数
//Winery object constructor
aWinery::aWinery()
{
name = new char[strlen("Unknown")+1];
strcpy(name, "Unknown");
location = new char[strlen("Unknown")+1];
strcpy(location, "Unknown");
year = new int;
year = 0;
acres = new float;
acres = 0;
successRating = new float;
successRating = 0;
}
//I have no idea whats going on here
//Winery destructor
aWinery::~aWinery()
{
if(name != NULL)
delete [] name;
if(location != NULL)
delete [] location;
if(year != 0)
delete year;
if(acres != 0)
delete acres;
if(successRating != 0)
delete successRating;
}
void aWinery::getLocation(char location[]) const
{
strcpy(location, this->location);
}
void aWinery::getYear(int year) const
{
year = this->year;
}
void aWinery::getAcres(float acres) const
{
acres = this->acres;
}
//I have no idea why this is written this way, I copied this from an instructor example
void aWinery::setLocation(char location0[])
{
if(this->location != NULL)
delete [] this->location;
this->location = new char[strlen(location0)+1];
strcpy(this->location, location0);
}
void aWinery::setYear(int year0)
{
if(this->year != 0)
delete this->year;
this->year = new int;
this->year = year0;
}
void aWinery::setAcres(float acres0)
{
if(this->acres != 0)
delete this->acres;
this->acres = new float;
this->acres = acres0;
}
aWineryヘッダファイル
#ifndef AWINERY_H
#define AWINERY_H
#include <iostream>
using namespace std;
//winery object
class aWinery
{
public:
//Constructor
aWinery();
//Destructor
~aWinery();
//Accessor Prototypes
void getName(char name[]) const;
void getLocation(char location[]) const;
void getYear(int year) const;
void getAcres(float acres) const;
void getSuccessRating(float successRating) const;
//Mutator Prototypes
void setName(char name0[]);
void setLocation(char location0[]);
void setYear(int year0);
void setAcres(float acres0);
void setSuccessRating(float successRating0);
private:
char* name;
char* location;
int* year;
float* acres;
float* successRating;
};
#endif
リストヘッダファイル
#ifndef ALIST_H
#define ALIST_H
#include <iostream>
using namespace std;
const int MAX_CHAR_LENGTH = 1000;
class list
{
public:
//Prototypes
void setInWinery(char name[], char location[], int year, float acres, float successRating);
void initializeDbase(char savePathName[]);
void printEntireDbase();
void deleteWinery(char nameOfWinery[]);
void whereIsWinery(char nameOfWinery[]);
void save(char savePathName[]);
//Accessor Prototypes
void getWineryName(char name[]) const;
void getWineryLocation(char location[]) const;
void getWineryYear(int year) const;
void getWineryAcres(float acres) const;
void getWinerySuccessRating(float successRating) const;
int getSize() const;
//Mutator Prototypes
void setWineryName(char name[]);
void setWineryLocation(char location[]);
void setWineryYear(int year);
void setWineryAcres(float acres);
void setWinerySuccessRating(float successRating);
//Constructor Prototype
list();
//Destructor
~list();
private:
//Wine object
struct node
{
aWinery wineryData;
node * nextByName;
node * nextByRating;
};
node * nameHead, * nameTail, * ratingHead, * ratingTail;
aWinery wineryData;
int size;
};
#endif
「誰かが私が間違ってやっていると指摘もらえますか? " - おそらくコース?あなたのインストラクターは自分自身の文字配列の割り当て、strlen/strcpyの使用などを教えてはいけません。 'std :: string'を使ってください。あなたのデータ型とリスト機能を混在させないでください。一つのことをうまく行い、それを個別にテストして理解してから再利用することができます。 'std :: list'は既にリストをよくしています。個々の値を格納するために 'int *'と 'float *'を使用しないでください。単にそれらを値で直接格納してください。最後に、このサイトでは、具体的な技術的な問題について*焦点を絞った質問をしてください。短いコード例があります。 –
@TonyD誰かが私にコース/学校/先生が馬鹿だと言ったたびに、私が一銭を持っていたら。私はダイスをたくさん持っています。彼らは明らかに優れていますが、私は多くの点で選択肢がありません。私は、将来、より小さな質問をお願いします。 –