liyujie
2025-08-28 b3810562527858a3b3d98ffa6e9c9c5b0f4a9a8e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
#include <fruit/fruit.h>
#include <iostream>
 
using fruit::Component;
using fruit::Injector;
 
class Writer {
public:
  virtual void write(std::string s) = 0;
};
 
class StdoutWriter : public Writer {
public:
  // Like "StdoutWriter() = default;" but also marks this constructor as the
  // one to use for injection.
  INJECT(StdoutWriter()) = default;
 
  virtual void write(std::string s) override {
    std::cout << s;
  }
};
 
class Greeter {
public:
  virtual void greet() = 0;
};
 
class GreeterImpl : public Greeter {
private:
  Writer* writer;
 
public:
  // Like "GreeterImpl(Writer* writer) {...}" but also marks this constructor
  // as the one to use for injection.
  INJECT(GreeterImpl(Writer* writer)) : writer(writer) {}
 
  virtual void greet() override {
    writer->write("Hello world!\n");
  }
};
 
Component<Greeter> getGreeterComponent() {
  return fruit::createComponent().bind<Writer, StdoutWriter>().bind<Greeter, GreeterImpl>();
}
 
int main() {
 
  Injector<Greeter> injector(getGreeterComponent);
  Greeter* greeter = injector.get<Greeter*>();
 
  greeter->greet();
 
  return 0;
}