【问题标题】:how can i use aggregation while separating my classes into a .h and .cpp files?如何在将我的类分成 .h 和 .cpp 文件时使用聚合?
【发布时间】:2021-03-18 03:46:00
【问题描述】:

上下文

我的教授给了我一个任务,让我使用 2 个类之间的聚合来制作一个程序,同时还将这些类分成 .h.cpp 文件。

我的解决方案

包含类声明的头文件:

#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 

【问题讨论】:

  • cout &lt;&lt; country.location; location 被声明为void location(string l);,因此它与输出到cout 完全不兼容,即使您将其作为函数正确调用也是如此。你是说cout &lt;&lt; contry.locate;
  • 我很确定错误消息是关于我所说的。这一行在这里:cout &lt;&lt; country.location;
  • 是的,因为 locate 是私有成员。如果您将定位成员作为公共变量,您可以将 void origin::address(){cout &lt;&lt; country.location;} 替换为 void origin::address(){country.location();} or by void origin::address(){cout
  • locate 设为公共成员。或者在medicalCompany中添加一个公共函数来返回它。
  • @drescherjm 问题已由 mr 行解决。 arnaud 写的,问题和你说的一样,drescherjm 所以非常感谢你们的帮助^_^

标签: c++ class c++11 aggregation


【解决方案1】:

您可以:

  • void origin::address(){cout &lt;&lt; country.location;} 替换为void origin::address(){country.location();}

  • by void origin::address(){cout &lt;&lt; country.locate;},如果您将locate 成员作为公共变量。

另外,几点说明:

  • 通常您希望避免暴露私有成员,因此应该首选第一个解决方案。

  • 指令using namespace std; 通常被认为是不好的做法,应该避免,因为可能的风险成本不会超过不必输入std::cout 的好处(有关更多信息,请参阅this question

  • 在命名约定方面,我会交换 locatelocation 的名称:location 应该是成员变量,locate 应该是获取位置的操作(函数)。

  • 更喜欢使用构造函数和初始化列表而不是 getter/setter。

  • 您的输出格式应该与您的类的逻辑非常分离,例如为您的类实现一个&lt;&lt; 运算符。

按照这个逻辑,你的代码应该看起来更像:

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

代码不起作用,您必须对其进行编辑以适应您的格式要求,但您有这个想法 :) 祝您好运!

【讨论】:

  • 成功了,先生,谢谢你的帮助和很好的建议,最好交换名字谢谢
  • 不客气! C++ 有时会让人感到困惑,尤其是当您开始并且@drescherjm 也有解决方案时!
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多