私はいくつかのパブリックメンバー関数とプライベート変数を持つかなり標準的なクラスを持っています。
私の問題は元々、クラスのオブジェクトインスタンスに動的に名前を付けることができないことに起因しているため、クラスタイプのポインターの配列を作成しました。
static CShape* shapeDB[dbSize];
コンストラクターに渡されるフィールドの情報を取得するためのプロンプトがいくつかあります(これは機能しているようです):
shapeDB[CShape::openSlot] = new CShape(iParam1,sParam1,sParam2);
openSlotは適切にインクリメントするため、別のCShapeオブジェクトを作成すると、次のポインターがそれを指すようになります。この次のコードは機能せず、一貫してクラッシュします。
cout << shapeDB[2]->getName() << " has a surface area of: " << shapeDB[2]->getSA() << shapeDB[2]->getUnits() << endl;
ポインタの配列はmainの外部でグローバルに宣言され、get()関数は文字列または整数を返すクラス内でパブリックになります。何が間違っているのかわかりませんが、ポインタの設定に関連する何かがあると確信しています。私はこのコードを書いているのは、クラス/ポインターについてもっと学ぶためですが、これを行おうとしている人が他に見つからないため、ひどく困惑しています。
また、CShapeの新しいインスタンスの名前も知りたいです。オブジェクトインスタンスを動的に作成し、メンバー関数のためにそれらにアクセスできるように名前を追跡する他の方法があれば、私はすべての耳です。
ポインタ参照/逆参照のあらゆる種類の順列を試しましたが、ほとんどがコンパイルできません。誰かがそれが役立つと思うなら、私はより大きなチャンクまたはすべてのコードを投稿することができます。
class CShape {
int dim[maxFaces];
int faces;
string units;
string type;
string name;
bool initialized;
int slot;
public:
static int openSlot;
CShape();
CShape(int, string, string); // faces, units, name
~CShape();
void initialize(void);
// external assist functions
int getA(void) {
return 0;
}
int getSA(void) {
int tempSA = 0;
// initialize if not
if(initialized == false) {
initialize();
}
// if initialized, calculate SA
if(initialized == true) {
for(int i = 0; i < faces; i++)
{
tempSA += dim[i];
}
return(tempSA);
}
return 0;
}
string getUnits(void) {
return(units);
}
string getName(void) {
return(name);
}
// friend functions
friend int printDetails(string);
};
// constructor with values
CShape::CShape(int f, string u, string n) {
initialized = false;
faces = f;
units = u;
name = n;
slot = openSlot;
openSlot++;
}