【问题标题】:c++ : cannot call member function without objectc++:不能调用没有对象的成员函数
【发布时间】:2017-03-05 23:30:27
【问题描述】:

我正在尝试编写一个带有映射的类,以保留具有唯一 ID 的注册表,以便以后访问对象。一切都编译得很好,直到我在 main 中编写了 for 循环,试图访问类的对象及其数据。我不知道到底出了什么问题。我声明了所有静态但不起作用。我已经尝试了几个小时,但无法解决。我知道问题出在地图上,因为这对我来说是新的,但我似乎找不到问题。希望有人看到我的代码有什么问题。

#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) 找到对相关对象的引用。但它似乎没有得到那个:)
  • commissionfixed 是一个成员函数,所以你必须在一个对象实例上调用它,例如val-&gt;commissionfixed(val);.
  • 这同样适用于commissionextra()
  • 对象实例在创建时只不过是一个指针。每个实例都没有特定的名称。这就是为什么我需要使用地图在需要时找到它们。

标签: c++ class static-members member-function-pointers


【解决方案1】:
#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;

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]; } 

void commissionfixed (){ 
commissievast = this->aantalpc*winstperpc; } 

void commissionextra (){ 
if (this->aantalpc>gemiddeldeverkoop){ commissieplus = (this->aantalpc - gemiddeldeverkoop) * 37; } } 

void readCommission(){

cout << "comission payment is " << this->commissievast << endl;
} 

static const int winstperpc; 
static int gemiddeldeverkoop;
 const int ID; 

string name;
protected: 
int aantalpc; 
int commissievast; 
int commissieplus;
 };

map<int, vertegenwoordiger*>vertegenwoordiger::registryMap;

const int vertegenwoordiger::winstperpc = 150; int vertegenwoordiger::gemiddeldeverkoop = 0;

 int main() { 

 for (int i=0; i<2; 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 << "next please : " << endl; } 

 for (int i=1; i<3 ; i++){ 

vertegenwoordiger* val = vertegenwoordiger::findbymap(i); 
val->commissionfixed ();
val->commissionextra ();

val->readCommission ();
} 


return 0; }

【讨论】:

  • 感谢我自己 :)))))))
猜你喜欢
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多