後でオブジェクトにアクセスするために、レジストリに一意のIDを保持するマップを持つクラスを作成しようとしています。クラスとそのデータのオブジェクトにアクセスしようとすると、mainのforループが書かれるまで、すべてコンパイルされています。私は間違っているものを失っている。私はすべて静的だと宣言したが、うまくいかない。私は数時間試してみましたが、解決できませんでした。私はそれが私にとって新しいものとして地図に問題があることを知っているが、私は問題を見つけるように見えない。誰かが自分のコードで何が間違っているのを見たいと思っています。C++:オブジェクトなしでメンバ関数を呼び出すことはできません
#include <iostream>
#include <map>
#include <cassert>
#include <string>
#include <algorithm>
using namespace std;
class vertegenwoordiger{
public:
vertegenwoordiger(int id, string x, int y): ID(id), name(x),aantalpc(y) {
addtoregistry(this);
cout << "Vertegenwoordiger " << x << " is aangemaakt met " << y << " aantal verkochte pc's " << endl;
gemiddeldeverkoop = (gemiddeldeverkoop + y)/id;
}
static map<int, vertegenwoordiger*>registryMap; // PROBLEM HERE I GUESS
static void addtoregistry(vertegenwoordiger* object){
registryMap[object->ID] = object;
}
static void removefromregistry(vertegenwoordiger* object){
registryMap.erase(object->ID);
}
static vertegenwoordiger* findbymap(int id){
return registryMap[id];
} // MAYBE THIS FUNCTION IS NOT CORRECT ASWELL????
void commissionfixed (vertegenwoordiger* obj){
commissievast = obj->aantalpc*winstperpc;
}
void commissionextra (vertegenwoordiger*obj){
if (obj->aantalpc>gemiddeldeverkoop){
commissieplus = (obj->aantalpc - gemiddeldeverkoop) * 37;
}
}
static const int winstperpc;
static int gemiddeldeverkoop;
const int ID;
protected:
string name;
int aantalpc;
int commissievast;
int commissieplus;
};
const int vertegenwoordiger::winstperpc = 150;
int vertegenwoordiger::gemiddeldeverkoop = 0;
int main()
{
for (int i=0; i<4; i++){
string naam;
int pc;
cout << "geef naam in :";
cin >> naam;
cout << "geef aantal pc op :";
cin >> pc;
vertegenwoordiger* test = new vertegenwoordiger (i+1,naam,pc);
cout << "volgende aub : " << endl;
}
for (int i=1; i<4 ; i++){
vertegenwoordiger* val = vertegenwoordiger::findbymap(i); // I GUESS THE PROBLEM IS RELATED TO THIS LINE
vertegenwoordiger::commissionfixed (val);
vertegenwoordiger::commissionextra (val);
}
return 0;
}
私はfindbymap(int型)によって、問題のオブジェクトへの参照を見つける必要があり、なぜ最初のハイテク、それはあります。しかし、それはそれを得ないように思えます:) – Stephane
'commissionfixed'はメンバ関数なので、オブジェクトインスタンス上で呼び出す必要があります。 'val-> commissionfixed(val);' –
同じことが 'commissionextra()'にも当てはまります。 –