Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类B中访问类A的函数f,而f需要访问B的成员变量_C++_Oop_C++11 - Fatal编程技术网

C++ 在类B中访问类A的函数f,而f需要访问B的成员变量

C++ 在类B中访问类A的函数f,而f需要访问B的成员变量,c++,oop,c++11,C++,Oop,C++11,考虑以下代码: class Car { public: bool openCar(); } class LocomotiveEngineer { public: bool carRepair(); private: std::list<int> m_screwdriver; std::vector<int> m_keys; Car myCar; } int main() { LocomotiveEngineer pet

考虑以下代码:

class Car 
{
public:
  bool openCar();
}

class LocomotiveEngineer
{
public: 
   bool carRepair();

private:
   std::list<int> m_screwdriver;  
   std::vector<int> m_keys; 
   Car myCar; 
}

int main() {
    LocomotiveEngineer peter;
}
在汽车的cpp中,我有如下内容:

Car::openCar()
{
   m_keys.size();             //openCar() can access m_keys via an instance of LocomotiveEngineer or whatever
   m_screwdriver.empty();   //openCar() can access m_screwdriver via an instance of LocomotiveEngineer or whatever
}
我该如何设计呢?我不断地犯错误。我想我应该使用这样的东西:类转发声明、朋友等等 提前谢谢。
ps:我仅限于c++11

只需将汽车作为
朋友添加到MotorveEngineer类:

class LocomotiveEngineer
{
public: 
    bool carRepair();

private:
   std::list<int> m_screwdriver;  
   std::vector<int> m_keys;

friend class Car;
}
cpp:

#include <vector>
class LocomotiveEngineer; // forward declare

class Car 
{
public:
  bool openCar(LocomotiveEngineer& repairmen); 
}

class LocomotiveEngineer
{
public: 
   bool carRepair(Car& broken_car); //specify the car whcih needs to be repaired

private:
   std::list<int> m_screwdriver;  
   std::vector<int> m_keys;

friend class Car;
}
bool  LocomotiveEngineer::carRepair(Car& broken_car) 
{
  broken_car.openCar(*this);
  return true;
}

bool  Car::openCar(LocomotiveEngineer& repairmen){
    repairmen.m_keys.size();             //openCar() can access m_keys
    repairmen.m_screwdriver.empty();   //openCar() can access m_screwdriver
    return true;
}
main*

int main(){
    Car brokenCar;
    LocomotiveEngineer bob;

    bob.carRepair(brokenCar);

    return EXIT_SUCCESS;
}
我必须指出,这种方式做的工作不是一个好的设计,而是足够的开始


您不能从
carRepair()
调用
openCar()
,因为没有对象可以调用它。@Evgeny如果这样做是正确的,那么应该创建一个对象。我已经把事情公开了,这样人们就可以提出如何设计整个系统了。但是,应该由您决定在何处创建它。我猜你对C++中的面向对象编程缺乏充分的理解。即使是关于这个主题的一本简单的书也会对你有很大的帮助。创建一个对象并不能解决这里提出的问题。我对oop做得很好,最明显的解决方案是将钥匙和螺丝刀作为参数传递给
openCar
。它不起作用。另一方面,工程师将变量作为静态变量不是一个好主意,他们只能在以后的frameworkIt工作中进行初始化。您需要一个
机车工程师的实例来访问其成员。e、 g.
myEngineer->m_keys.size()
我正在尝试,但它不起作用。您可以发布为您工作的代码吗?好的,在标题中向前声明MotorveEngineer(类MotorveEngineer;)并更改
breaked\u car->openCar(*this)后,它工作了
断车。敞车(*此)
机车工程师::carRepair
int main(){
    Car brokenCar;
    LocomotiveEngineer bob;

    bob.carRepair(brokenCar);

    return EXIT_SUCCESS;
}