PC
およびPrinter
は基底クラスItem
の派生クラスです配列の要素をPC
またはPrinter
またはそれらの組み合わせにすることができるように、ユーザーの入力に基づいて配列のメモリを割り当てる必要があります。基本クラスのオブジェクトへのポインタの配列内の要素の型はどのように分かっていますか?
すべてのエラーが同じである:
ERROR: class "Item" has no member "getPC_Counter()" and "getP_Counter()" and "setCapacity()" and "setType()"
非常に奇妙な、複雑な方法で、私の質問をして申し訳ありませんが、私は本当に、適切に任意の方法を私の質問を説明する方法がわからないここに私のコードは次のと私は私がコメントで把握することはできませんか説明してみましょう:
#include<iostream>
#include<string>
using namespace std;
class Item {
int ID;
public:
Item() {
ID = 0;
}
Item(int i) {
ID = i;
}
void print() {
cout << ID << endl;
}
int getID() {
return ID;
}
};
class PC :public Item {
static int PCc;
string type;
public:
PC() {
type = "";
PCc++;
}
void setType(string t) {
type = t;
}
void print() {
Item::print();
cout << type << endl;
}
string getType() {
return type;
}
int getPC_Counter() {
return PCc;
}
};
class Printer: public Item {
int capacity;
static int printerc;
public:
Printer() {
capacity = 0;
printerc++;
}
void setCapacity(int c) {
capacity = c;
}
void print() {
Item::print();
cout << capacity << endl;
}
int getCapacity() {
return capacity;
}
int getP_Counter() {
return printerc;
}
};
int PC::PCc = 0;
int Printer::printerc = 0;
int main() {
Item *store[5];
string c, t;
int cap;
cout << "pc or printer?" << endl;
for (int i = 0; i < 5; i++) {
cin >> c;
if (c == "pc") {
store[i] = new PC();
cout << "type?" << endl;
cin >> t;
//here how do i use the current element as an object of type PC?
store[i]->setType(t);
}
if (c == "printer") {
store[i] = new Printer();
cout << "capacity?" << endl;
cin >> cap;
//here how do i use the current element as an object of type Printer?
store[i]->setCapacity(cap);
}
}
//here how do i know if the element is of type printer or pc ?
//how do i use the getP_counter() and getPC_Counter funcions properly?
cout << "number of printers: " << store[0]->getP_Counter() << endl;
cout << "number of PCs: " << store[0]->getPC_Counter() << endl;
return 0;
}
(またはnullptr C++ 11以上であれば)を使用します。これが機能するには、基本クラスに単一の仮想関数が必要です。デストラクタは通常の選択であり、基本クラスポインタを使用してオブジェクトを削除するので、ここでは適切です。あなたは現時点ではありませんが、メモリリークを避けたい場合にはそうなります。 –
基本クラス 'Item'に仮想デストラクタがありません。それがなければ、 'store'配列内のそれらのアイテムを'削除 'すると、未定義の動作が呼び出されます。 – PaulMcKenzie