在多个类中实现堆栈时的一个定义规则(ODR)

时间:2015-05-28 09:10:49

标签: c++ stack one-definition-rule

似乎无法让简单的堆栈实现正常工作。我只是试图获得两个不同的类(B类和C类),以便能够在由第三个类(A类)管理的相同堆栈中推送和打印元素。

A.cpp

#include "A.h"
void A::pop() {}
void A::push() {}
void A::print() {}  // prints last pushed elements

A.H

#include < iostream >
  class A 
  {
    public:
    void pop();
    void push();
    void print();
  }

B.cpp

#include "B.h"
#include "A.h"

A a;

void B::Text() { a.push(); }
void B::Background() { a.print(); }  // works!

C.cpp

#include "C.h"
#include "A.h"

A _a; // why doesn't A a work? because ODR?
void B::Text() { _a.push(); }
void B::Background() { _a.print(); } // doesn't work! breakpoint shows empty stack!

我认为我打破了One Definition Rule。我是对的吗?

2 个答案:

答案 0 :(得分:1)

是的,每个变量必须只定义一次。 在C.cpp。

中使用extern A a

答案 1 :(得分:1)

通过在B.cpp中创建A a和在C.cpp中创建A a,你实际上有2个不同的对象,它们不会指向同一个堆栈。

实现相同目标的另一种方法是将A作为单身对象。