Предположим, у меня есть 2 класса Foo
и Cook
, а Book
- это структура.
Ранее Book
- глобальная переменная, и я хотел бы изменить ее на принадлежность Foo
чтобы у меня было много Foo
с их собственной Book
.
Cook
читает Book
, но Foo
будет время от времени обновлять ценность Book
.
Следующий код, который я тестировал, не работает. Я очень новичок в C++, я не понимаю, почему это не работает.
class Foo {
private:
Book book;
Cook cook;
public:
Foo();
virtual ~Foo();
};
class Cook {
private:
Book * book;
public:
Cook();
virtual ~Cook();
void setBook(Book * book);
};
Затем внутри конструктора Foo
есть: cook.setBook(&book);
То, что вы делаете, должно работать нормально, хотя я не могу согласиться с тадманом, что вы должны использовать std::shared_ptr
.
Если вы видите, что ваши значения не синхронизированы, вероятно, вы перезаписали Foo.book
но это изменение не было распространено на Foo.cook.book
.
Возможный лучший дизайн:
class Foo {
private:
Book book;
Cook cook;
Book& getBook();
public:
Foo() : cook(std::bind(getBook,this));
virtual ~Foo();
};
class Cook {
private:
std::function<Book&()> _memfunptr;
public:
Cook(std::function<Book()> memfunptr): _memfunptr(memfunptr);
virtual ~Cook();
};
Отсюда в любое время, когда вы захотите обратиться к Foo.book
внутри Foo.cook
вы можете просто использовать Cook._memfunptr
для доступа к нему.
В качестве примечания здесь некоторые из вас могут быть связаны с реализацией класса? У вас должна быть точка с запятой в конце каждого class
, и вы должны быть конструктором Cook
должен быть определен Cook();
не Cook cook;
,