簡體   English   中英

我如何在將我的類分成 ah 和 .cpp 文件時使用聚合?

[英]how can i use aggregation while separating my classes into a .h and .cpp files?

語境

我的教授給了我一個任務,讓我使用 2 個類之間的聚合來制作一個程序,同時將這些類分成.h.cpp文件。

我的解決方案

包含 class 聲明的 header 文件:

#include <iostream>
#include <string>
using namespace std;

class medicalCompany {
private:
    string ceoName;
    string email;
    string phoneNumber;
    string locate;
public:
    medicalCompany();
    void Name(string n);
    void mail(string m);
    void phone(string p);
    void location(string l);
    ~medicalCompany();

};
class origin {
private:
    medicalCompany country;
    
public:
    origin();
    void address();
    ~origin();

};

和我的.cpp 文件:

#include <iostream>
#include "function.h"
#include <string>
using namespace std;
medicalCompany::medicalCompany() {
    cout << "OUR COMPANY IS GLAD TO BE OF SERVICE !" << endl;
    cout << "****************************************************" << endl;
}
void medicalCompany::Name(string n){
    ceoName = n;
    cout << "OUR CEO IS " << endl;
    cout<< ceoName << endl;
    cout << "****************************************************" << endl;
}
void medicalCompany::mail(string m) {
    email = m;
    cout << "USE OUR EMAIL TO CONTACT US : " << endl;
    cout<< email << endl;
    cout << "****************************************************" << endl;
}
void medicalCompany::phone(string p) {
    phoneNumber = p;
    cout << "THIS IS OUR CUSTOMER SERVICE PHONE NUMBER " << endl;
    cout<< phoneNumber << endl;
    cout << "****************************************************" << endl;
}
void medicalCompany::location(string l) {
    locate = l;
    cout << " OUR COMPANY IS LOCATED IN " << endl;
    cout << locate << endl;
    cout << "****************************************************" << endl;
}
medicalCompany::~medicalCompany() {
    cout << "thanks for trusting our company ^_^" << endl;
    cout << "****************************************************" << endl;
}
origin::origin() {
    cout<< "constructor 2"<<endl;
}
void origin::address() {
    cout << country.location;
}
origin::~origin() {
    cout << "bye" << endl;
}

這兩個類在我的main.cpp文件中使用:

#include <iostream>
#include <string>
#include "function.h"
using namespace std;

int main() {

    medicalCompany o;
    o.Name("jack");
    o.mail("ouremail@company.com");
    o.phone("2342352134");
    o.location("Germany");
    origin o2;

    return 0;
}

問題

我遇到了這個錯誤:

Severity Code Description Project File Line Suppression State
Error   C3867 'medicalCompany::location': non-standard syntax; use '&' to create a pointer to member    CP2_HW  c:\function.cpp 41 

您可以:

  • void origin::address(){cout << country.location;}替換為 void void origin::address(){country.location();}

  • 或者by void origin::address(){cout << country.locate;}如果您將locate成員作為公共變量。

另外,幾點說明:

  • 通常您希望避免暴露私有成員,因此應該首選第一種解決方案。

  • using namespace std; 通常被認為是不好的做法,應該避免,因為可能的風險成本不會超過不必鍵入std::cout的好處(有關更多信息,請參見此問題

  • 在命名約定方面,我會交換locatelocation的名稱: location 應該是成員變量和locate獲取位置的動作(函數)。

  • 更喜歡使用構造函數和初始化列表而不是 getter/setter。

  • 您的 output 格式應該與您的類的邏輯完全分開,例如為您的 class 實現<<運算符。

按照這個邏輯,您的代碼應該更像:

#include <iostream>
#include <string>

class medicalCompany {
private:
  std::string _ceoName;
  std::string _email;
  std::string _phoneNumber;
  std::string _location;
public:
  
  // Constructor
  medicalCompany(std::string name, std::string email, std::string phone, std::string location):
  _ceoName(name), 
  _email(email), 
  _phoneNumber(phone), 
  _location(location)
  {}
  friend ostream& operator<<(ostream& os, const medicalCompany& dt);
  };

對於 ostream 運營商:

ostream& operator<<(ostream& os, const medicalCompany& co)
{
    os << co._ceoName << " " co._phoneNumber << ' ' << co._email;
    return os;
}

這將允許在您的 main 中編寫這樣的代碼:

int main() {
  medicalCompany o("jack", "ouremail@company.com","2342352134","Germany")
  std::cout << o << std::endl;   
  return 0;
}

該代碼不起作用,您必須對其進行編輯以滿足您的格式要求,但您有想法:)祝您好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM