2015-04-14 3 views
0

Рассмотрим случай, когда объект класса B хочет отправить свой идентификатор объекту A. Таким образом, идентификатор A может быть установлен в ID B. Это можно рассматривать как размещение заказа. Затем A хочет сообщить B о состоянии своего заказа (например, отправлен заказ). Таким образом, B должен иметь атрибут, который должен быть установлен A. В приведенном ниже коде у меня есть первая часть, которая позволяет B разместить заказ в A, но отсутствует вторая часть, которая позволяет A обновлять B. Мой вопрос: «Как это можно сделать?»C++: Взаимосвязь между двумя классами

class A 
{ 
private: 
    string ID; 

public: 
    A() 
    { 
     ID = "empty"; 
    } 

    void set_ID(string id) 
    { 
     ID = id; 
    } 
}; 

class B 
{ 
private: 
    string B_ID; 

public: 
    B(string id) 
    { 
     B_ID = id; 
    } 

    void put_request(A& a) 
    { 
     a.set_ID(B_ID); 
    } 
}; 

int main() 
{ 
    A a; 
    B b("my ID"); 
    b.put_request(a); 
} 
+2

Вы в конечном итоге возникают проблемы с отсутствующим вперед декларации 'класса B;'? В противном случае я не могу сказать, о чем вы спрашиваете. Вы предоставляете другую функцию в 'A', которая принимает параметр« B & »как то же, что и вы, с' put_request() 'в' B'. –

+0

Как идея, попробуйте это: сначала объявите оба класса, затем в каждом классе определите переменную другого класса и взаимодействуйте с этими переменными. – moldovean

+0

'A' и' B' указывают на тот же идентификатор в конце концов. Вы можете захотеть иметь 2 идентификатора переменных в обоих этих классах для дифференциации. – iammilind

ответ

0

Я не уверен, если я понимаю вашу проблему, но в случае, если вы не можете заставить его работать из-за проблемы с определением имен:

  1. Отдельной реализацией методов из организма каждых класс.
  2. Вперед объявить класс, который определяется как второй.

Кроме того, вы можете объявить две переменные в каждом классе:

  1. my_ID имеет идентификатор для этого конкретного экземпляра.
  2. ID имеет идентификатор, установленный put_request() (возможно, первоначально установлен на my_ID?).

Теперь код:

class B; 

class A 
{ 
private: 
    string my_ID; 
    string ID; 

public: 
    A() 
    : my_ID("empty") 
    , ID(my_ID) 
    { } 

    void set_ID(string id); 
    void put_request(B& b); 
}; 

class B 
{ 
private: 
    string my_ID; 
    string ID; 

public: 
    B(string id) 
    : my_ID(id) 
    , ID(my_ID) 
    { } 

    void set_ID(string id); 
    void put_request(A& a); 
}; 


void A::set_ID(string id) { this->ID = id; } 

void A::put_request(B& b) { b.set_ID(this->my_ID); } 


void B::set_ID(string id){ this->ID = id; } 

void B::put_request(A& a) { a.set_ID(this->my_ID); } 
+0

@Adrian Ah, да, извините за эти ошибки типографии, исправлены сейчас. –

+0

Вышеуказанный ответ завершен и исправлен, спасибо Mateusz, но имеет незначительную ошибку опечатки: в классе B «void put_request (B & b);», следует заменить на «void put_request (A & a);». Еще раз спасибо. – Adrian

0

вы можете попробовать на ideone

#include <iostream> 
using namespace std; 

class A 
{ 
private: 
    string ID; 

public: 
    A() 
    { 
     ID = "empty"; 
    } 

    void set_ID(string id) 
    { 
     ID = id; 
    } 

    void write_ID() 
    { 
     cout<<"A id : "<<ID<<"\n"; 
    } 
}; 

class B 
{ 
private: 
    string B_ID; 

public: 
    B(string id) 
    { 
     B_ID = id; 
    } 

    void put_request(A* a) 
    { 
     a->set_ID(B_ID); 
    } 
}; 

int main() 
{ 
    A a; 
    a.write_ID(); 

    B b("my ID"); 
    b.put_request(&a); 

    a.write_ID(); 
} 
0

Это лучше не посылать B идентификатор класса А, но дают указатель на объект B , Таким образом, объект может получить доступ к идентификатору B и, возможно, к другой информации класса B, необходимой для обработки запроса.

Каждый из объектов должен иметь свой собственный идентификатор. Вы не должны заменять идентификатор A на идентификатор B.

Для того, чтобы поместить запрос в объект A, более понятным будет вызов метода A с параметром класса B. Не так.

Пример:

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

class B; 

class A 
{ 
private: 
    string id; 
    B* request; 

public: 
    A(const string& id) 
    { 
     this->id = id; 
     request = NULL; 
    } 

    void set_request(B* request) 
    { 
     this->request = request; 
    } 

    string get_request_id() const; 
}; 

class B 
{ 
private: 
    string id; 

public: 
    B(const string& id) 
    { 
     this->id = id; 
    } 

    string get_id() const 
    { 
     return id; 
    } 
}; 

string A::get_request_id() const 
{ 
    if (!request) 
     return string(); 
    return request->get_id(); 
} 

int main() 
{ 
    A a("A"); 
    B b("my ID"); 
    a.set_request(&b); 
    std::cout << a.get_request_id() << std::endl; 
} 
Смежные вопросы